Bash脚本调用ExifTool时单引号参数执行无效问题求助
解决Bash脚本调用ExifTool修改日期的单引号与格式问题
我来帮你搞定这个ExifTool日期修改的坑!看了你的脚本,主要问题出在单引号的传递逻辑、日期格式错误以及不必要的嵌套xargs上,咱们一步步修正:
原脚本的核心问题
- 日期格式错误:你写的
+00:00:00多了一个冒号,ExifTool不认这种时区格式,正确的应该是+00:00 - 嵌套xargs冗余:
ls -1 |xargs -t -I _ xargs exiftool...这层嵌套完全没必要,会导致文件名传递混乱,ExifTool拿不到正确的目标文件 - 变量引用不严谨:没有用双引号包裹目录/文件名,遇到带空格的路径直接报错
- 缺少错误检查:没判断输入的目录是否存在,cd失败后脚本会继续执行,导致后续操作全错
修正后的脚本(基础版)
#!/bin/bash # 先检查输入的目录是否有效 if [ ! -d "$1" ]; then echo "错误:请提供一个存在的目录路径!" exit 1 fi # 进入目标目录,失败则直接退出 cd "$1" || exit 1 # 构造正确的日期字符串:用单引号包裹值,时区格式修正为+00:00 # basename "$PWD"确保拿到纯目录名(即使$1是绝对路径也没问题) DATE_STR="'$(basename "$PWD") 13:00:00+00:00'" # 遍历文件修改日期:去掉冗余的xargs,直接传递文件名给exiftool ls -1 | xargs -t -I {} exiftool -FileModifyDate=$DATE_STR {} # 移动文件到目标目录 ls -1 | xargs -t -I {} mv {} ~/desktop/pictures/ # 返回上级目录并删除原目录 cd .. rm -r "$1"
更健壮的版本(用find替代ls)
如果你的目录里有带空格、换行符的特殊文件名,ls会出问题,推荐用find+xargs -0组合,能处理所有特殊字符:
#!/bin/bash if [ ! -d "$1" ]; then echo "错误:请提供一个存在的目录路径!" exit 1 fi TARGET_DIR="$1" # 构造日期字符串,用目录名作为日期部分 DATE_STR="'$(basename "$TARGET_DIR") 13:00:00+00:00'" # 确保目标目录存在,避免mv报错 mkdir -p ~/desktop/pictures/ # 遍历所有文件(只处理当前目录,不递归子目录) find "$TARGET_DIR" -maxdepth 1 -type f -print0 | xargs -0 -t exiftool -FileModifyDate=$DATE_STR # 移动文件到目标目录 find "$TARGET_DIR" -maxdepth 1 -type f -print0 | xargs -0 -t mv -t ~/desktop/pictures/ # 删除原目录 rm -r "$TARGET_DIR"
关键细节说明
- 日期标签选择:如果你要修改的是系统层面的创建时间(比如Mac的“创建日期”),可能需要用
-FileCreateDate标签,而不是-FileModifyDate;如果是照片的EXIF创建日期,用-CreateDate,根据你的需求调整。 - 单引号传递:这里把整个日期值用单引号包裹是对的,ExifTool要求标签值如果含空格必须用引号,我们通过变量把单引号直接传递给exiftool,避免了转义的麻烦。
- 错误处理:增加了目录存在检查、cd失败退出、目标目录提前创建,让脚本更稳定。
内容的提问来源于stack exchange,提问作者Irvin Cote
相关产品推荐
相关产品推荐

