我想弄清楚文件夹结构中文件的图片日期。某些文件夹名称包含空格。现在我尝试设置引号,但它不起作用。
任何人都可以给我一个提示吗?
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!"
编辑:这是我得到的输出:
'/volume1/Intern/path/to/images/IMG_4206.jpg': Failed to open the file
答案 0 :(得分: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 **/*.@(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
}'
shell选项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'
的文件,包括单引号 - 不存在。< / p>