Bash:递归复制并重命名文件

3
我有很多以“_100.jpg”结尾的文件,它们分布在嵌套的文件夹/子文件夹中。现在,我想要一种可以递归地复制和重命名所有这些文件的技巧,使它们具有“_crop.jpg”后缀。不幸的是,我不熟悉bash脚本编写,所以不知道确切的做法。我通过谷歌搜索并尝试了带有“-exec”参数的“find”命令,但没有成功。请帮助我。谢谢。

相关问题:根据多个模式重命名文件的更好方法 - Michaël Le Barbier
3个回答

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

太棒了!这是我在这个主题上读过的最简单的解决方案!当我读到它时,我只是想知道为什么我自己没有发现它!也许是因为我不够聪明 :) - pierroz

2

如果您有Bash 4

shopt -s globstar
for file in **/*_100.jpg; do 
  echo mv "$file" "${file/_100.jpg/_crop.jpg}"
one

或者使用find。
find . -type f -iname "*_100.jpg" | while read -r FILE
do
  echo  mv "${FILE}" "${FILE/_100.jpg/_crop.jpg}"
done

缺少引号,无法处理包含换行符的文件名。请改用find ... -execfind ... -print0 | xargs -0 - Philipp
是的,缺少引号并已修复。因此不需要使用xargs。接受的答案也没有引号。 - ghostdog74

1

这个使用 Perl 脚本,你的系统上可能已经有了。有时候它被称为 prename 而不是 rename

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

如果你需要保护文件名中重复出现的"_100",或者不想改变名称的部分,你可以使正则表达式更加健壮。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接