Help us understand the problem. What is going on with this article?

find hogehoge | xargs ls -ltr を正しく動かす

More than 3 years have passed since last update.

問題

  • 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やファイルサイズ等も指定して表示できるので、大抵は事足りる。

shusugmt
internetmultifeed
インターネットエクスチェンジサービス「JPNAP」および、IPv6 ISPローミングサービス「transix」を提供しているネットワークサービスの会社です。
https://www.mfeed.ad.jp
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away