我有很多文件的名字以'_100.jpg'结尾。它们在嵌套的文件夹/子文件夹中传播。现在我想要一个诡计递归地复制和重命名所有这些后缀为'_crop.jpg'的后缀。不幸的是,我不熟悉bash脚本,所以不知道做这件事的确切方法。我用google搜索了一下,并且用'-exec'para尝试了'find'命令,但没有运气。Bash:递归复制和重命名文件
Plz帮助我。谢谢。
我有很多文件的名字以'_100.jpg'结尾。它们在嵌套的文件夹/子文件夹中传播。现在我想要一个诡计递归地复制和重命名所有这些后缀为'_crop.jpg'的后缀。不幸的是,我不熟悉bash脚本,所以不知道做这件事的确切方法。我用google搜索了一下,并且用'-exec'para尝试了'find'命令,但没有运气。Bash:递归复制和重命名文件
Plz帮助我。谢谢。
find bar -iname "*_100.jpg" -printf 'mv %p %p\n' \
| sed 's/_100\.jpg$/_crop\.jpg/' \
| while read l; do eval $l; done
非常好!这是我阅读过这个主题的最简单的解决方案!当我读到它时,我只是想知道为什么我自己找不到它!也许B/C我不够聪明:) – PierrOz 2010-09-24 15:14:02
,如果你有bash的4
shopt -s globstar
for file in **/*_100.jpg; do
echo mv "$file" "${file/_100.jpg/_crop.jpg}"
one
或使用发现
find . -type f -iname "*_100.jpg" | while read -r FILE
do
echo mv "${FILE}" "${FILE/_100.jpg/_crop.jpg}"
done
缺少引号,不适用于包含换行符的文件名。使用'find ... -exec'或'find ... -print0 |而不是xargs -0'。 – Philipp 2010-07-19 10:07:36
是的,缺少引号并修复。所以不需要使用xargs。接受的答案没有报价。 – ghostdog74 2010-07-19 10:21:23
此使用您可能已经在你的系统上的Perl脚本。它有时也被称为prename
而不是rename
:
find /dir/to/start -type f -iname "*_100.jpg" -exec rename 's/_100/_crop' {} \;
可以使正则表达式更强大的,如果你需要保护某些文件名“_100”重复或你不想改了名字的部分。
相关问题:[更好的方式基于多个模式重命名文件](http://stackoverflow.com/a/25597051/2654678)。 – 2014-08-31 23:11:44