私のコンピュータ上のすべてのファイルを一覧表示しました。
FILES=$(find . -type f -name '*' -printf "%s/%f\n" | sort -n)
出力は次のようになります。
"size/file_name"
56872/file.txt
98566/test
1000254/foo
コンピュータでエラーが発生します。
find: -printf: unknown primary or operator
解決策はありますか?
答え1
この-printf
オプションは使用できません。POSIX
find
。これがGNUの特徴ですfind
、例えばLinuxの場合。
使用している特定の実装は表示されません。おそらく拡張がないPOSIXでしょう。たとえば、そうではありません。FreeBSDまたはOSX。
ない場合は、次のようないくつかの選択肢があります(埋め込まれたスペースなどを処理しませんが、ツールについてはほとんど想定していません)。
find . -type f -exec ls -ld {} \; | awk '{ gsub("^.*/","",$9); printf "%s/%s\n", $5, $9; }'
利用可能なツールに関する追加情報を使用すると、(通常)ソリューションを改善できます。
答え2
find
そしてxargs
GNU stat
:
find . -type f -print0 | xargs -0r stat -c '%s/%n'
この特定の問題では、このGNUバージョンは実際には必要ありません。 GNUはとにかくfind
サポートしているためですが、表示できないファイルに関する情報を見つけるprintf
など、他の状況では役に立ちます。stat
find ... -printf
しかし、FreeBSDとMac OS Xは別の話です。
find
そしてxargs
FreeBSD(とMac OS X)stat
:
find . -type f -print0 | xargs -0r stat -f '%z/%N'
オプションで、出力をパイプして各ファイル名の先頭をsed -e 's:/./:/:'
削除します./
。
私の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