无法打开文件

时间:2017-01-30 22:25:28

标签: sed quotes

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

任何人都可以给我一个提示吗?

  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

1 个答案:

答案 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选项globstarextglob启用**/*.*@(jpg|JPG)表达式,该表达式返回整个目录树中以jpgJPG结尾的所有文件

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>