重命名多个文件夹中的多个文件名

用户名

我知道您可以执行以下操作以使用以下方式重命名单个文件夹中的所有文件名:

for file in 1_*; do
    mv "$file" "${file/1_/}"
done

但是,是否可以跨多个文件夹执行此操作?例如,它将搜索当前目录中的所有文件夹并进行更改。

我有bash版本4.3

mklement0

一个健壮的解决方案,假设您具有GNUBSD / OSXfind

find . -type f -name '1_*' -execdir sh -c 'echo mv -- "$1" "${1#1_}"' _ {} \;

注意:
-为了安全起见,这只会mv命令;删除echo以执行实际的重命名。
-OP的替代"${file/1_/}"已更改为POSIX-compatible "${file#1_}",实际上更接近意图。
-如果您确实需要系统上可能支持或可能不支持的替换,例如"${file/1_/}"最好显式调用已知的支持它的shell -符号链接被忽略(文件和目录);用于将它们包括在内(既是要重命名的潜在文件,又是下降到目录的符号链接)。shbash
find -L ...find

  • find . -type f -name '1_*'在当前目录的()子树中查找-type f名称与1_*-name '1_*'匹配的所有文件(.
  • -execdir在当前文件所在的子目录中执行传递给它的命令
  • sh -c 'echo mv -- "$1" "${1#1_}"' _ {} \;调用默认的shell(sh):
    • 使用命令字符串(传递给-c
      • mv -- "$1" "${1#1_}"有效地1_从第一个位置参数($1表示的文件名中删除前缀
    • 和dummy参数_sh将分配给$0,在这里不重要)
    • 以及{}外壳将绑定到的当前文件的路径$1
    • \;只是终止-execdir的论点。

请注意,请--确保不会将任何以。开头的文件名-误认为是选项mv通过类似的用法)。


-execdir不符合POSIX;如果兼容POSIX的变体因此比较麻烦:

find . -type f -name '1_*' -exec sh -c \
  'cd -- "${1%/*}" && f=${1##*/} && echo mv -- "$f" "${f#1_}"' _ {} \;
  • cd -- "${1%/*}" 更改到手头文件所在的目录。
    • 注意:cd -- "$(dirname -- "$1")"通常更健壮,但效率较低;由于我们知道在这种情况下,$1它始终是路径而不是单纯的文件名,因此我们可以使用更有效的cd -- "${1%/*}"
  • f=${1##*/} 从手边的文件路径中提取纯文件名。
  • 然后,命令行的其余部分类似地工作。

性能说明

上面的解决方案很简洁,但是效率很低,因为必须为每个匹配的文件生成一个shell实例

一个潜在的加速是使用的一个变种峰的做法,但只有当你避免调用外部公用事业while循环(除mv):

find . -type f -name '1_*' | while IFS= read -r f; do
   new_name=${f##*/}       # extract filename
   new_name=${new_name#1_} # perform substitution
   d=${f%/*}               # extract dir
   echo mv -- "$f" "$d/$new_name"  # call mv to rename
done

上面的假设有冒用嵌入的换行符破坏文件名的风险(非常罕见);使用GNU或BSDfind可以解决此问题。

使用这种方法,仅产生一个shell实例,该实例将在循环中处理所有匹配的文件名-只要在循环中调用唯一外部实用程序为mv,这通常会比使用find-only的解决方案更快-exec[dir]

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何重命名多个文件名包含子文件夹?

将多个文件夹中的重复文件名重命名为另一个名称

如何重命名多个文件夹中的多个文件?

如何重命名文件夹中的文件名?

重命名文件夹中的文件名

重命名多个csv文件夹中的csv列

重命名文件名中的多个特殊字符

重命名多个目录中的文件名

从文件名重命名文件夹 [脚本]

在文件夹,子文件夹和多个文件中递归查找和重命名

尝试重命名文件夹中的文件(基于文件名中的字符串)

重命名文件夹中的文件,忽略当前文件名

无法重命名文件,文件夹名称与Ubuntu 13.10中的文件名冲突

在PowerShell中批量重命名多个文件夹中的多个文件

如何使用一个命令重命名多个文件夹中的多个文件

使用python重命名多个子文件夹中的多个文件

PowerShell重命名多个文件,文件名的特定部分

重命名文件夹中的文件名时,通配符不适用于重命名

使用 R 中的函数从多个文件夹中复制相同的文件并根据文件夹结构重命名文件

编写批处理文件以重命名多个文件夹中的文件

如何通过在Windows中的文件名之间添加通用名来重命名多个文件?

在Unix文件夹中的多个文件名中替换多个字符

如何使用累进编号重命名多个文件夹?

根据列表重命名多个文件夹

批处理文件以从 CSV 读取文件名并重命名文件夹中的文件

批量更改多个文件夹中的多个文件名

用bash重命名多个文件名

如何以特定格式重命名文件夹中的多个文件?

需要通过 VBScript 重命名特定文件夹中的多个文件