問題
-
find
した結果をmtime順に並び替えたいとき単純に思いつく方法はfind hogehoge | xargs ls -lrt
だが、対象のファイル数が多い場合は想定通りの出力にならない-
find / | xargs ls -dltr
を実行すれば、想定通りになっていないのがすぐ分かる
-
原因
- コマンドライン引数の最長は
ARG_MAX
で決まる -
xargs
は渡す引数の長さがARG_MAX
を超える場合、自動的にコマンドを分割する -
find
の結果のファイル数が多い場合、xargs
で渡す引数がARG_MAX
を超え、そのたびにその引数毎に区切られてls -ltr
が実行されるので、想定通りの結果にならない
解決方法
find
のオプションを使ってmtime
を先頭に表示しsort
にパイプで渡す。
find . -printf "%T+ %p\n" | sort
ls
は標準入力やファイルから対象を指定することが出来ないため、ls
を回避するしかない。printfでuidやファイルサイズ等も指定して表示できるので、大抵は事足りる。