下面~/Pictures
有一些包含 jpeg 的子目录,例如
~/Pictures/Pics 1/img.jpg
.
从bash
:
~/Pictures $ `file Pics\ 1/img.jpg`
输出:
Pics 1/img.jpg: JPEG image data, Exif standard:: [TIFF image data,
little-endian, direntries=12, description=....
我创造script.sh
并chmod a+x
#!/bin/bash
VAR=$(builtin printf "%q" "$1")
CMD="file $VAR"
EXIF=eval "$CMD"
echo "$EXIF"
~/Pictures $ ./script.sh Pics\ 1/img.jpg
输出:
./script.sh: line 4: file Pics\ 1/img.jpg: No such file or directory
还尝试了 img.jpg 的完整路径和/usr/bin/file
操作系统:Raspbian 更新/升级
我已经阅读了几个类似的问题/答案,但没有得到密钥
编辑: 也许对某人来说使用它会很有用exiftool
,file
因为我在标记为解决方案的答案中以评论形式发布了由于区域设置问题(并且因为我获得了更多信息),所以我将使用 exiftool。
脚本.sh:
#!/bin/bash
COMM="/usr/bin/exiftool -Description \"$1\""
DESCR=$(eval "$COMM")
DESCRIPTION=${DESCR#"Description : "}
echo "$DESCRIPTION"
它正确输出元数据描述有特殊字符的
答案1
无需在脚本中巧妙地引用。只需确保双引号$1
(以及任何其他变量)的扩展:
#!/bin/bash
exif=$( file "$1" )
printf '%s\n' "$exif"
要不就
#!/bin/bash
file "$1"
跑步:
./script.sh Pics\ 1/img.jpg
或者,
./script.sh "Pics 1/img.jpg"
或者,
./script.sh "Pics 1"/img.jpg
在您的脚本中发生的事情是您创建\
路径名的一部分。它不是路径名的一部分,它只是为了转义命令行上的空格。
此外,您还可以在命令执行期间将字符串分配eval
给环境变量。您的意思可能是,但这不是必需的(见上文)。EXIF
file
EXIF=$( eval "$CMD" )
如果你真的想要将完整file
命令存储在变量中,您应该使用数组:
#!/bin/bash
cmd=( file "$1" )
exif=$( "${cmd[@]}" )
printf '%s\n' "$exif"
再说一次,这里不需要eval
。
...即使我们编写它/bin/sh
(它没有数组,但确实有位置参数列表,显然也可用bash
):
#!/bin/sh
set -- file "$1"
exif=$( "$@" )
printf '%s\n' "$exif"