awkを使用してファイル名/パスにスペースがあるls出力を処理する

awkを使用してファイル名/パスにスペースがあるls出力を処理する

すべて、
findコマンドを使用して特定のフォルダ内のすべてのpngファイルをフィルタリングし、そのファイルとサイズを一覧表示するスクリプトがあります。次の形式で出力したいと思います。

 someFile.png => 1.2K 

私はawkを使って$ 5(人間に優しい形式のファイルサイズ)と$ 9(パス)を手に入れます。これが私が現在使っているものです:

 find "$somePath"  -iname "*.png" -print0 | xargs -0 ls -lh  | awk '{print $9,"=>",$5}'

時にはファイル名やパスにスペースがあり、スクリプトエラーが発生することがあります。以下はサンプル出力です。
/Users/test/Desktop/Test/image1 => 1.2K
/Users/test/Desktop/Test/image1.png => 1.4K

出力の最初の項目は「image1 test.png」というファイルです。 ls出力を解析してはならないという内容をどこかで読みました。この問題を解決するための最良の方法は何ですか?

ベストアンサー1

通常、出力を別のプログラムにパイプするのではなく、execを使用してfindに目的のアクションを実行させることができます。

find "$somePath" -iname "*.png" -printf '%p => %s\n'

人間に似た次元が本当に必要な場合は、もう少し複雑です。

find "$somePath" -iname "*.png" -exec printf '{} => ' \; -exec sh -c 'ls -sh "{}" | cut -f1 -d\  ' \;

最後はparsingですがls、私が知っている限り、ここでは最初の列だけを取得し、一度に個々の項目を処理するので、最初の列にスペースを含めることはできません。リスト)関係ありません。それ以外の場合は、別のプログラムを使用して寸法を表示できます。 BSDとLinuxでは使用できますstat。 Solarisでは、ファイルサイズを出力するために独自のプログラムを作成する必要があるかもしれません。

重要なことは、find必要なものを実行するために常に使用できることです。フルファイル名- これは、適切な区切り文字なしでリストからファイル名を抽出しようとしません。

おすすめ記事