私は、その後、あなたの結果は
"/path/to/photo1.jpg","2017:01:15","22:19:15"
"/path/to/another/photo.JPG","2017:01:15","22:10:01"
のように写真への絶対パスを探すことになっている取りますDateTimeOriginal
日時。すべて引用符で囲みます。
exiv2
は、実際にファイル引数に複数の写真を撮ることができますので、全体のプロセスは、2つのコマンドのパイプラインに簡素化することができます。
# Need this for the fileglob
shopt -s globstar extglob
exiv2 -pa -g DateTimeOriginal **/*[email protected](jpg|JPG) |
awk -v pwd="$PWD/" -v dq='"' -v OFS=',' '{
fn = substr($0, 1, match($0,/*Exif\.Photo/)-1)
print dq pwd fn dq, dq $(NF-1) dq, dq $NF dq
}'
シェルオプション、globstar
とextglob
、**/*.*@(jpg|JPG)
表現を可能にしますディレクトリツリー全体に対してjpg
またはJPG
で終わるすべてのファイルを返します。
exiv2
は、DateTimeOriginal
データを含むファイルに対して何かを返します。中間出力は次のようなもの(いくつかの空白は削除)になります。
dir1/photo1.jpg Exif.Photo.DateTimeOriginal Ascii 20 2017:01:22 10:20:36
dir1/photo3.jpg Exif.Photo.DateTimeOriginal Ascii 20 2017:01:22 10:20:36
dir with space/photo2.JPG Exif.Photo.DateTimeOriginal Ascii 20 2017:01:22 10:20:38
dir with space/photo4.JPG Exif.Photo.DateTimeOriginal Ascii 20 2017:01:22 10:40:09
photo5.jpg Exif.Photo.DateTimeOriginal Ascii 20 2017:01:24 20:06:38
photo6.JPG Exif.Photo.DateTimeOriginal Ascii 20 2017:01:22 10:00:55
これはawkを持つ、簡単だろうが、それは問題に言及したようにスペースを含むパスにありませんでした。 exiv2
出力はスペースで区切られており、そこにタブを取得するためのオプションではないようですので、いくつかのawkの策略が必要です。
- スラッシュに続いて、現在のディレクトリのパスが、、に渡されますコマンド
-v pwd="$PWD/"
を使用します。
- 乱雑なエスケープを避けるため、二重引用符を
-v dq='"'
と定義しています。
- 出力フィールドセパレータは、
-v OFS=','
のカンマに設定されています。
- ファイル名を取得するには、一連の空白のインデックスに続いて
Exif.Photo
を検索し、そのインデックスの直前で終了する部分文字列をfn
に割り当てます。
- 引用符とカンマで区切って印刷するには、
dq
変数を使用し、ファイル名の前にpwd
のパスを付けて、それぞれ$(NF-1)
と$NF
を使用して2番目のフィールドと最後のフィールドを取得します。
結果をファイルにこれを取得するには
"/home/benjamin/tinker/space dir/dir1/photo1.jpg","2017:01:22","10:20:36"
"/home/benjamin/tinker/space dir/dir1/photo3.jpg","2017:01:22","10:20:36"
"/home/benjamin/tinker/space dir/dir with space/photo2.JPG","2017:01:22","10:20:38"
"/home/benjamin/tinker/space dir/dir with space/photo4.JPG","2017:01:22","10:40:09"
"/home/benjamin/tinker/space dir/photo5.jpg","2017:01:24","20:06:38"
"/home/benjamin/tinker/space dir/photo6.JPG","2017:01:22","10:00:55"
のようなもので、リダイレクト> ausgabe.csv
は、コマンドに追加する必要があります。
あなたのコマンドがうまくいかなかった理由は、例として1つのファイルを見てみましょう。 sedステップの後に、'./photo5.jpg'
のようなものがあります。今、あなたは/photo5.jpg'
を与えるcut -c 3-
を使用します。あなたのEXIF
ラインで
、あなたは今exiv2
が存在しない単一引用符–含め、文字通り'/photo5.jpg'
と呼ばれるファイルを探して、別の単一引用符を追加します。
デバッグコードを追加するか、または削除して、そのエラーメッセージを生成している行を特定し、修正します。エラーメッセージを生成する可能性のあるコードは約4行か5行しかないので、この質問を投稿するのと同じくらい時間がかかります。 –