【问题标题】:Bash: recursively copy and rename filesBash:递归复制和重命名文件
【发布时间】:2010-07-19 09:31:51
【问题描述】:

我有很多名称以“_100.jpg”结尾的文件。它们分布在嵌套文件夹/子文件夹中。现在我想要一个技巧来递归复制并重命名它们,使其具有“_crop.jpg”的后缀。不幸的是,我不熟悉 bash 脚本,所以不知道执行此操作的确切方法。我用谷歌搜索并尝试了带有'-exec'参数的'find'命令,但没有运气。

请帮助我。谢谢。

【问题讨论】:

标签: shell


【解决方案1】:
  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 我不够聪明:)
【解决方案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

【讨论】:

  • 缺少引号,不适用于包含换行符的文件名。请改用find ... -execfind ... -print0 | xargs -0
  • 是的,缺少引号并已修复。所以不需要使用xargs。接受的答案也没有引号..
【解决方案3】:

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

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

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

【讨论】:

    猜你喜欢
    • 2013-02-07
    • 2010-12-11
    • 2015-05-09
    • 2020-03-24
    • 2014-08-11
    • 1970-01-01
    • 2011-01-11
    • 2015-12-04
    • 1970-01-01
    相关资源
    最近更新 更多