すべてのテキストファイルをサイズ順に並べ替え、パスのテキストリストを作成します。

すべてのテキストファイルをサイズ順に並べ替え、パスのテキストリストを作成します。

これにより、すべてのテキスト ファイルへのパスのリストが表示されます。

find / -type f -name '*.txt' > ~/Desktop/sorted.txt

このパス リストを各項目のファイル サイズに従って並べ替えたいのですが、何を使うべきかわかりません。これは期待どおりには機能しません。

find / -type f -name '*.txt' |sort -S > ~/Desktop/sorted.txt

助言がありますか?

答え1

このコマンドは、wc一致するファイルごとに別のプロセスを使用するため、パフォーマンスが低下する可能性があります。互換性と POSIX 準拠を考慮して作成しました。

find / -type f -name '*.txt' -exec wc -c {} \; | sort -t ' ' -n -k 1,1 | cut -d ' ' -f 2-

それぞれがwc -cフォームに行を生成する

12345 /path/to/file/possibly with spaces/foo.txt

最初のスペースはバイト数とパスを区切ります。sortすべての行を取得し、スペース文字をフィールド区切り文字として使用し、最初のフィールド、つまりバイト数に従って数値順に並べ替えます。次に、cutスペース文字をフィールド区切り文字として使用し、2 番目のフィールド、つまり最初のフィールド以外のすべて、つまりバイト数以外のすべて、つまりパスを出力します。

このソリューションは、行数でソートするように簡単に適応できます。wc -lの代わりにを使用するだけですwc -c


注:
1 つ以上の改行文字を含むパスは、私のコードを壊します。コードがこれの影響を受けないようにするには、区切り文字として null 文字をサポートするツールを使用します。POSIX ツールでは、これは可能であったとしても困難です。この回答は移植性に重点を置いているため、テキスト ファイルへのすべてのパスが「適切」であることを願っています。

答え2

ツールを連結するという(おそらく最適ではない)アプローチを常に採用できます。

find / -type f -name '*.txt' -ls  | sort -nk7,7 | awk '{print $NF;}'
  • find のスイッチ-lsは、ファイル サイズを含むいくつかの追加列を表示します (GNU ツールセットでは 7 番目の列、MacOS では異なる場合があります)
  • sort7列目(ファイルサイズ)で数値ソートを行います。
  • 他のフィールドはawkすべて削除され、ファイル名のみが印刷されます。

関連情報