Я принимаю это ваш результат должен выглядеть
"/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'
, включая одинарные кавычки –, которые не существуют.
Так что добавьте код отладки и/или разделите его, чтобы определить, какая строка создает это сообщение об ошибке, а затем исправить. Есть только около 4 или 5 строк кода, которые могут вызывать сообщение об ошибке, это займет у вас столько же времени, сколько и для публикации этого вопроса. –