bashエラーを探す:-printf:未知のデフォルトまたは演算子

bashエラーを探す:-printf:未知のデフォルトまたは演算子

私のコンピュータ上のすべてのファイルを一覧表示しました。

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そしてxargsGNU stat

find . -type f -print0 | xargs -0r stat -c '%s/%n'

この特定の問題では、このGNUバージョンは実際には必要ありません。 GNUはとにかくfindサポートしているためですが、表示できないファイルに関する情報を見つけるprintfなど、他の状況では役に立ちます。statfind ... -printf

しかし、FreeBSDとMac OS Xは別の話です。

findそしてxargsFreeBSD(と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

関連情報