2017-01-30 14 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 может реально взять несколько фотографий в файле аргументов, так что весь процесс может быть упрощен к трубопроводу из двух команд:

# 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, чтобы получить второе и последнее и последнее поле соответственно.

В результате получается нечто вроде

"/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 должен быть добавлен к команде.


Что касается причины, по которой ваша команда не работает: давайте рассмотрим один файл в качестве примера. После шага sed у вас есть что-то вроде './photo5.jpg'.Теперь вы используете cut -c 3-, что дает вам /photo5.jpg'.

В вашей EXIF линии, можно добавить еще один апостроф, так что теперь exiv2 ищет файл буквально под названием '/photo5.jpg', включая одинарные кавычки –, которые не существуют.