2017-01-30 9 views
0

私は、フォルダ構造のファイルの画像の日付を把握しようとしています。一部のフォルダ名には空白が含まれています。今私は引用符を設定しようとするが、それは動作しません。ファイルを開くことができません

誰でも私にヒントを教えてもらえますか?

find . -name "*.jpg" -or -name "*.JPG" >> files.txt 
    sed -e "s/\(.*\)/'\1'/" files.txt >> files2.txt 
    for fn in `cat files2.txt`; do 
    DATEI=$(echo "$fn" | cut -c 3-) 
    EXIF=$(/usr/bin/exiv2 -pa --grep DateTimeOriginal "'"$PWD$DATEI | awk -F" " '{print $4","$5}') 
    if [ -z "$EXIF" ] 
    then 
    : 
    else 
    echo "$PWD$DATEI,$EXIF" >> ausgabe.csv 
    fi 
done 
echo "DONE!" 

EDIT:これは私が手に出力されます:

'/volume1/Intern/path/to/images/IMG_4206.jpg': Failed to open the file 
+0

デバッグコードを追加するか、または削除して、そのエラーメッセージを生成している行を特定し、修正します。エラーメッセージを生成する可能性のあるコードは約4行か5行しかないので、この質問を投稿するのと同じくらい時間がかかります。 –

答えて

0

私は、その後、あなたの結果は

"/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 
}' 

シェルオプション、globstarextglob**/*.*@(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'と呼ばれるファイルを探して、別の単一引用符を追加します。

関連する問題