打开文件失败
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 选项,globstar
和 extglob
,启用 **/*.*@(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'
的文件,包括单引号 - 它不存在.
我想找出文件夹结构中文件的图片日期。一些文件夹名称包含空格。现在我尝试设置引号,但它不起作用。
有人可以给我提示吗?
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 选项,globstar
和 extglob
,启用 **/*.*@(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'
的文件,包括单引号 - 它不存在.