次のシェルスクリプトは、20MBを超えるすべてのファイルをどのように検索しますか?

次のシェルスクリプトは、20MBを超えるすべてのファイルをどのように検索しますか?

次のようにすると、サイズが20Mbを超えるファイルをすべて見つけることができるという記事を見ました。

find / -type f -size +20000k -exec ls -lh {} \; 2> /dev/null   | awk '{ print $NF ": " $5 }'  | sort -hrk 2,2

うまくいくようですが、「+20000k」の後に何をしているのかわかりません。

ベストアンサー1

find / -type f -size +20000k -exec ls -lh {} \; 2> /dev/null   | awk '{ print $NF ": " $5 }'  | sort -hrk 2,2
  • /: ホームディレクトリで開始を検索
  • -type f:一般ファイルのみを探す
  • -size +20000k:サイズが20000k以上です。
  • -exec ls -lh {} \;:見つかった各ファイルに対して実行されますls -lh。つまり、長い形式と人間が読めるサイズ(サフィックス「K」、「M」、「G」などを含む)としてリストされます。
  • 2>/dev/nullfindエラーメッセージが生成されたらブラックホールにリダイレクトします。
  • |find結果を次のコマンドにパイプします(この場合はawk)。
  • awk '{print $NF ": " $5}':出力の最後のフィールド、ls -lhコロン、5番目のフィールドを印刷します。最後のフィールドはファイル名で、5番目のフィールドはファイルサイズ(前述の人が読める形式)です。
  • |:結果を再パイプします(今回はawkからからsort)。
  • sort -hrk 2,2:2番目のフィールドのみを考慮して、人間が読める数字に基づいて逆順に結果をソートします。

ノート

awkコマンドを使用せずに、これを簡単かつ迅速に実行できますsort

find / -type f -size +20000k -exec ls -Shs {} +

どこ

  • ls -Shs:ファイルを一覧表示し、サイズで並べ替えながら、人間が読める形式でサイズを印刷します。
  • {} +見つかったファイルをfindリストに追加し、リストls全体の最後にのみ実行します。各ファイルを{} \;個別に実行する場合。ls

これら2つのコマンドの唯一の違いは、前者の場合、サイズは第2の列に印刷されるのに対し、後者の場合は第1の列に印刷されることである。ただし、ファイル名またはディレクトリ名にスペースが含まれている場合、出力ls -lにはファイルごとに異なる数の列があるため、出力はawk多少ランダムになります。つまりlsの出力を解析しないでください。

おすすめ記事