これにより、すべてのテキスト ファイルへのパスのリストが表示されます。
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 では異なる場合があります) sort
7列目(ファイルサイズ)で数値ソートを行います。- 他のフィールドは
awk
すべて削除され、ファイル名のみが印刷されます。