検索を使用してすべてのファイルをサイズで並べ替える

検索を使用してすべてのファイルをサイズで並べ替える

練習として、サブディレクトリのパッドを含む、指定された拡張子(.txtなど)を持つすべてのパッドをサイズでソートするスクリプトを完成させる必要があります。

For example; 
./ex1.sh einstein txt
einstein/copyright.txt
einstein/do-how.txt
einstein/etext9/bil11.txt
einstein/etext9/2ws271.txt
einstein/etext9/liber11.txt
einstein/etext0/bib0010h/Readme.txt
einstein/etext0/kknta10.txt

du またはその他の高度なコマンドは使用できません。ある時点では find を使用する必要がありますが、次のことを試しました。

find -depth - type f -name "*.$extension" | sort ....

しかし、サイズでソートする方法がわからないので、これはうまくいきません。私が得た結果は名前でソートされます。

ls -lhSに似ていますが、サブディレクトリを含む出力を探しています。

答え1

AFAIKで実行できる唯一の注文は、インクルードfindディレクトリ(オプション)の前にコンテンツを表示することです-depth。サイズで並べ替えるには、別のものを使用する必要があります。

GNUルックアップがある場合は、以下を試してください。

find . -type f -iname "*.$extension" -printf "%s %p\n" | sort -n | sed 's/^[0-9]* //'

-printf "%s %p\n"サイズとファイルパスを印刷して数字でソートし、ストリップサイズを使用しますsed

答え2

私は使う

   find . -type f -iname "*.$extension" -print0 | xargs -0 ls -lS

これは私には大丈夫です。

答え3

そしてzsh

printf '%s\n' **/*.$extension(D.oL)

ls -lhGNUタイプの出力を取得するにはGNUを使用してくださいls

ls -Ulhd -- **/*.$extension(D.oL)

またはリストが大きすぎる場合:

autoload zargs # best in ~/.zshrc
zargs --eof= -- **/*.$extension(D.oL) '' ls -Ulhd --

または

printf '%s\0' **/*.$extension(D.oL) | xargs -r0 ls -Ulhd --

何らかの理由で使用する必要がある場合は、findいつでも次のことができます。

printf '%s\0' ./**/*.$extension(D.oL) | xargs -r0 sh -c '
  exec find "$@" -prune ...' sh

答え4

とは別にムルの答え

-exec du '{}' ';'代わりに使用して-printf "%s %p"同じ形式を生成できます。だから最後のコマンドは次のようになります

find . -type f -iname "*.$extension" -exec du '--' '{}' ';' | sort -n | sed 's/^[0-9]* //'

説明-exec du '-b' '--' '{}' ';'

  1. -execフラグはfindコマンド(例du:)を実行し、引数に表示さ{}れるすべてのエントリをファイルパスに置き換えるように指示します。
  2. '-b'duキロバイトの代わりにバイトを出力するようにコマンドに指示します。
  3. '--'オプションの終わりを示す(フラグ?名前の助けが必要です)、残りの引数は位置引数です。これが必要な例は、あいまいな名前のオプションファイルを使用して操作を実行することです。-whatever
  4. '{}'ポイント1に戻り、findそれをファイルパスに置き換えます。
  5. ";"引数が終了し、残りの引数は正常に処理できることをfindコマンドに通知します。-exec

関連情報