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

18 浏览
0 Comments

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

我有许多文件的文件名以“_100.jpg”结尾。它们分布在嵌套的文件夹/子文件夹中。现在我想要一个技巧来递归地复制并重命名它们,使它们的后缀为“_crop.jpg”。不幸的是,我对bash脚本不熟悉,所以不知道具体的做法。我尝试了使用“find”命令和“-exec”参数,但没有成功。请帮帮我。谢谢。

0
0 Comments

问题原因:需要递归地复制和重命名文件。

解决方法:使用Perl脚本中的rename命令来实现。

以下是解决该问题的代码示例:

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

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

0
0 Comments

问题出现的原因是缺少引号,这会导致文件名中包含换行符的文件无法正常工作。解决方法是使用find ... -execfind ... -print0 | xargs -0来代替原来的方法。

如果你使用的是bash 4,可以使用以下代码:

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

如果不是bash 4,可以使用以下代码:

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

这些代码修复了缺少引号的问题,所以不再需要使用xargs。但是,接受的答案也没有引号。

0
0 Comments

问题出现的原因是需要递归地复制和重命名文件,但找不到一个简单的解决方法。作者对这个解决方法表示赞赏,并认为自己可能没有找到它的原因是自己不够聪明。

解决方法是使用find命令来查找满足条件的文件,然后使用sed命令将文件名中的"_100.jpg"替换为"_crop.jpg",最后使用while循环和eval命令执行重命名操作。这个方法简单且有效。

0