PC内のすべてのファイルのリストを作成します。
FILES=$(find . -type f -name "*" -printf "%s/%f\n" | sort -n)
出力は次のようになります。
"size/file_name" 56872/file.txt 98566/test 1000254/foo
PCでエラーが発生します
find: -printf: unknown primary or operator
解決策はありますか?
コメント
回答
-printf
オプションがPOSIX
find
。これは、GNU find
の機能です(例:Linux)。
特定の実装使用しているものは表示されていません。拡張機能のないPOSIXである可能性があります。たとえば、 FreeBSD や OSX にはありません。
それがなければ、いくつかの代替手段を使用できます。たとえば、これ(埋め込みブランクなどは処理されませんが、ツールについてはほとんど想定されません):
find . -type f -exec ls -ld {} \; | awk "{ gsub("^.*/","",$9); printf "%s/%s\n", $5, $9; }"
利用可能なツールに関する詳細情報があれば、(通常は)ソリューションを改善することができます。
コメント
- お願いします。上記のように出力" file_size / file_name "のリスト?
- なぜ
ls
find ... -print0
を使用して、xargs -0r stat ...
にパイプする方がはるかに良い場合は?stat
のGNUバージョンとFreeBSDバージョンの両方に、出力をフォーマットするための(残念ながら異なる/互換性のない)オプションがあり、OPの要求に応じてsize/filename
を表示できます。 。 - OPは、特定のプラットフォーム固有のソリューションを想定できる情報を提供しませんでした。
回答
find
およびxargs
とGNU stat
:
find . -type f -print0 | xargs -0r stat -c "%s/%n"
GNU find
はprintf
とにかく(ただし、stat
がfind ... -printf
であるファイルについて見つけることができることがあるため、他のコンテキストで役立つ場合があります。表示できません。
FreeBSD &ただし、Mac OSXは別の話です。
find
およびxargs
とFreeBSD( Mac OS X)stat
:
find . -type f -print0 | xargs -0r stat -f "%z/%N"
オプションで、出力を
は、各ファイル名の先頭にある./
を削除します。
FreeBSDテストVMからのサンプル出力:
# find . -type f -print0 | xargs -0r stat -f "%z/%N" | sed -e "s:/./:/:" | head 149/.k5login 254/.profile 1169/.cshrc 297/.login 5589/.history 171/.ssh/known_hosts 1803/.ssh/authorized_keys 6699/.bash_history 368/.bashrc 4065/.viminfo
find
のバージョンは何ですか?