打开文件失败

Failed to open the file

我想找出文件夹结构中文件的图片日期。一些文件夹名称包含空格。现在我尝试设置引号,但它不起作用。

有人可以给我提示吗?

  find . -name "*.jpg" -or -name "*.JPG" >> files.txt
    sed -e "s/\(.*\)/''/" 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 ","}')
    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

我认为你的结果应该是这样的

"/path/to/photo1.jpg","2017:01:15","22:19:15"
"/path/to/another/photo.JPG","2017:01:15","22:10:01"

照片的绝对路径,然后是 DateTimeOriginal date/time,全部用引号括起来。

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([=11=], 1, match([=11=], / *Exif\.Photo/)-1)
    print dq pwd fn dq,  dq $(NF-1) dq, dq $NF dq
}'

shell 选项,globstarextglob,启用 **/*.*@(jpg|JPG) 表达式,returns 所有以 jpg 结尾的文件或JPG 用于整个目录树。

exiv2 returns 仅针对包含 DateTimeOriginal 数据的文件。中间输出看起来像这样(删除了一些白色space):

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

如果不是问题中提到的带有 space 的路径,这对于 awk 来说会很简单。 exiv2 输出是 space 分隔的,而且似乎没有获取制表符的选项,因此需要一些 awk 技巧:

  • 使用 -v pwd="$PWD/".
  • 将当前目录的路径后跟一个斜线传递到命令中
  • 为了避免乱码转义,我们用-v dq='"'定义双引号。
  • 输出字段分隔符设置为逗号 -v OFS=','
  • 为了获取文件名,我们搜索一系列 space 的索引,然后是 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' 的文件,包括单引号 - 它不存在.