ディレクトリ内の最古のファイルのタイムスタンプをディレクトリのタイムスタンプに反映

find . -type d | while read -r dir; do touch "$dir" -r "$dir/`ls -t "$dir" | tail -1`"; done

ちとめどい.「while read -r dir」と「"$dir"」がポイント.
日本語や空白を含むファイル名をもつファイルに処理を適用するのは↓が定石だが,xargs では 1 ファイルごとに適用が必要な touch -r は使えない.

find . -print0 | xargs -0 cmd ...

1 ファイルごとにコマンドを適用するには↓が定石だが,-exec 内ではパイプは使えない?

find . -exec cmd {} \;

そこで,find の標準出力から read -r でファイル名を読み込むのを while で繰り返す.この際,read -r で読み込んだファイル名に含まれる空白を維持するために "$dir" のように "" で括る.

追記 2009/07/20

Cygwin - find が途中で止まる
Cygwinのfindが途中で止まる - 地獄の猫日記

Cygwin 版 find で Windows の日本語ファイル名を含むディレクトリに適用すると find が途中で止まることがあるらしい (しかも止まった旨のエラー表示もない).
その場合,何か代替のコマンドを使わないとこの方式は使えない.

とりあえず,ディレクトリを再帰的には辿らないけど,下記のコマンドで代替.

for dir in *; do [ -d "$dir" ] && touch "$dir" -r "$dir/`ls -t "$dir" | tail -1`"; done