検索+貼り付け+検索:ファイルごとに複数のクエリ

検索+貼り付け+検索:ファイルごとに複数のクエリ

私は少なくとも次のフィールドを含む1行のディレクトリにある各ファイルをインポートしようとしています(順序は重要ではありませんが、順序はより良いです)。

 - Image resolution, in case it is an image. If not, just blank.
 - Modification date
 - Human readable file size
 - Filename

ディレクトリ内のファイルはjpgイメージで、残りはプレーンテキストファイルです。私は同様のことを試しました:

find . -type f -exec paste `identify {} 2> /dev/null` `ls -goh {}` \;

ls教えてくださいcannot access {}2> /dev/null内部部分は、identifyjpg以外のファイルに関するエラーメッセージをスキップするために使用されます。

xargs私も他の組み合わせなどを試しましたが、$()まだ方法が見つかりませんでした。

どんな提案がありますか?

ベストアンサー1

-execこれは含まれているスクリプトで役に立ちます。

find . -name \*.png -exec sh -c 'printf '%s,%s\\\\n' "$(identify -format '%hx%w' "$1")" "$(stat -c %y,%s,%n "$1")";' bash {} \; > out.csv

出力例は次のとおりです。

32x32,2018-09-21 15:04:33.216773000 -0400,192,./favicon.png
20x20,2018-09-21 15:04:33.225771000 -0400,1202,./delete.png

読みやすくするために、スクリプトは次のように分類されます。

find . -name \*.png -exec sh -c 
  'printf '%s,%s\\\\n' 
     "$(identify -format '%hx%w' "$1")" 
     "$(stat -c %y,%s,%n "$1")";' 
  bash {} \; > out.csv

個々の内容を挿入するには、追加の引用符を参照し\nてくださいprintf

Outside find、現在ディレクトリにあるファイルに対してこの種の出力を取得するには、次の手順を実行します。

for f in ./*.png
do
  printf '%s,%s\n' "$(identify -format '%hx%w' "$f")" "$(stat -c %y,%s,%n "$f")"
done

出力例は次のとおりです。

20x20,2018-09-21 15:04:33.225771000 -0400,1202,./delete.png
32x32,2018-09-21 15:04:33.216773000 -0400,192,./favicon.png

3番目のコマンドでは、必要に応じてこれらの部分を交換したり、他の部分を追加したりできます。他の%s参照コマンドを追加するだけです。

単純なCSV形式の出力を生成したがファイル名にカンマを含めることができる場合は、ファイル名を引用符で囲む必要があります。ファイルサイズを単純バイト文字列から数千ビット単位のカンマ文字列に変換する場合も同様です。

おすすめ記事