2010-07-19 85 views
3

我有很多文件的名字以'_100.jpg'结尾。它们在嵌套的文件夹/子文件夹中传播。现在我想要一个诡计递归地复制和重命名所有这些后缀为'_crop.jpg'的后缀。不幸的是,我不熟悉bash脚本,所以不知道做这件事的确切方法。我用google搜索了一下,并且用'-exec'para尝试了'find'命令,但没有运气。Bash:递归复制和重命名文件

Plz帮助我。谢谢。

+0

相关问题:[更好的方式基于多个模式重命名文件](http://stackoverflow.com/a/25597051/2654678)。 – 2014-08-31 23:11:44

回答

6
find bar -iname "*_100.jpg" -printf 'mv %p %p\n' \ 
    | sed 's/_100\.jpg$/_crop\.jpg/' \ 
    | while read l; do eval $l; done 
+0

非常好!这是我阅读过这个主题的最简单的解决方案!当我读到它时,我只是想知道为什么我自己找不到它!也许B/C我不够聪明:) – PierrOz 2010-09-24 15:14:02

2

,如果你有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 
+0

缺少引号,不适用于包含换行符的文件名。使用'find ... -exec'或'find ... -print0 |而不是xargs -0'。 – Philipp 2010-07-19 10:07:36

+0

是的,缺少引号并修复。所以不需要使用xargs。接受的答案没有报价。 – ghostdog74 2010-07-19 10:21:23

1

此使用您可能已经在你的系统上的Perl脚本。它有时也被称为prename而不是rename

find /dir/to/start -type f -iname "*_100.jpg" -exec rename 's/_100/_crop' {} \; 

可以使正则表达式更强大的,如果你需要保护某些文件名“_100”重复或你不想改了名字的部分。