我的相机以以下格式存储照片:
DSC_0001 (2015_07_30 10_34_56 UTC).NEF
DSC_ 迭代后的数字以及指定时间和日期的括号,但是所有时间和日期信息都在元数据中,因此我希望将其生成的所有文件重命名为:
DSC_0001.NEF etc
我已经研究了rename
bash 中的命令,但无法理解如何让它执行我想要的操作,我想更改文件夹中的所有文件。
如果您能解释为什么您的建议有效,我将不胜感激,这样我就可以尝试学习如何在将来解决类似的问题。
笔记:如果这有什么区别的话,我正在使用 Bash。
答案1
使用 Perl 重命名工具:
rename 's/ \(.*?\)//' *.NEF
正则表达式应该很简单(.*?
匹配最短的字符串)。
很难看为什么 Debian/Ubuntu 上的重命名实用程序与其他发行版(例如 CentOS)上的重命名实用程序不同?关于两个不同的rename
命令。
答案2
如果文件位于单身的没有子目录的文件夹,该文件夹名为photos
:
for pathname in photos/*(*).NEF; do
newname=${pathname##*/}
newname=${newname%% '('*}.NEF
printf 'Would move "%s" to "%s"\n' "$pathname" "${pathname%/*}/$newname"
# mv -i "$pathname" "${pathname%/*}/$newname"
done
这将迭代photos
名称中包含 a(
并以).NEF
.通过从当前路径名中删除目录名,然后删除剩余内容中␣(
(空格和)之后的所有内容并添加到名称末尾来创建新文件名。(
.NEF
为了安全起见,文件的实际重命名被注释掉。
上面代码的输出示例:
Would move "photos/DSC_0001 (2015_07_30 10_34_56 UTC).NEF" to "photos/DSC_0001.NEF"
如果文件位于较大目录结构中的某个位置:
find photos -type f -name '*(*).NEF' -exec sh -c '
for pathname do
newname=${pathname##*/}
newname=${newname%% \(*}.NEF
printf "Would move "%s" to "%s"\n" "$pathname" "${pathname%/*}/$newname"
# mv -i "$pathname" "${pathname%/*}/$newname"
done' sh {} +
这里唯一的区别是为循环生成相关文件的路径名的方式。在这种情况下,find
将批量传递找到的路径名到循环,但循环本身与此答案的第一部分相同(对引用进行了一些细微修改)。
有关的:
答案3
(
如果所有文件名中(而不是路径中)都有空格括号 ( ) 对,您可以使用:
mv "$f" "${f%% (*}.NEF"
要循环所有文件,请执行以下操作:
$ for f in dir/*\(*\).NEF; do [ -f "$f" ] && mv "$f" "${f%% (*}.NEF"; done
答案4
您必须位于文件所在的目录中
let a=0; for i in *.NEF; do let a=a+1; b=`basename $PWD`; c=`printf %04d$b.NEF $a`; mv $i $c; done
同时重命名所有内容。