
私は少なくとも次のフィールドを含む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
内部部分は、identify
jpg以外のファイルに関するエラーメッセージをスキップするために使用されます。
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形式の出力を生成したがファイル名にカンマを含めることができる場合は、ファイル名を引用符で囲む必要があります。ファイルサイズを単純バイト文字列から数千ビット単位のカンマ文字列に変換する場合も同様です。
答え2
代替テキストは、検索が開始される前に一度評価されます。現在好ましい方法はです$( )
。引用されたコマンドをシェルに渡すことができますが、最も簡単な方法はスクリプトを生成しますfind
。