如果文件夹名称在bash中以4位数字结尾,则在此处递归重命名并添加parenthere

如果文件夹名称在bash中以4位数字结尾,则在此处递归重命名并添加parenthere,bash,rename,recursive-query,parentheses,mv,Bash,Rename,Recursive Query,Parentheses,Mv,我一直在尝试递归重命名名称以四位数字结尾的文件夹 例如,我的文件夹名称如下: 这是名称2004 我正试图将其重命名为: 这是名字(2004) 我已尝试拆分名称的前缀和数字部分,但无法将这些文件夹重命名为mv 以下是我迄今为止尝试过的代码: #!/bin/bash F=$(find . -name '*[0-9]' -type d) for i in "$F"; do R2=$(echo "$i" | awk '{print $NF}') R1=$(echo "$i" | sed 's/.\{

我一直在尝试递归重命名名称以四位数字结尾的文件夹

例如,我的文件夹名称如下:

这是名称2004

我正试图将其重命名为:

这是名字(2004)

我已尝试拆分名称的前缀和数字部分,但无法将这些文件夹重命名为
mv

以下是我迄今为止尝试过的代码:

#!/bin/bash
F=$(find . -name '*[0-9]' -type d)

for i in "$F";
do

R2=$(echo "$i" | awk '{print $NF}')
R1=$(echo "$i" | sed 's/.\{4\}$//')
R3=$(echo "$R2" | sed -r "s/(^[0-9]+$)/(\1)/g")

mv "$i" "$R1 $R3"
# Even tried:

mv "\"$i"\" "\"$R2 $R3"\"


done
是否有人可以查看或/和建议一些指导,以允许
mv
查找初始文件夹及其目标?

以下命令:

find -name '*[0-9][0-9][0-9][0-9]' -type d -exec bash -c 'for dir; do mv "$dir" "${dir%[0-9][0-9][0-9][0-9]}(${dir#${dir%[0-9][0-9][0-9][0-9]}})"; done' - {} + -prune
应该有用

  • 双引号环绕变量展开式
  • ${dir%[0-9][0-9][0-9][0-9]}
    删除最后4位后缀
  • ${dir#${dir%[0-9][0-9][0-9][0-9]}
    删除前面的前缀
  • -exec bash-c'..'-{}+
    要跳过
    -c命令
    后的第一个参数,该命令用于
    -0
    ,请参见
    man bash
    /-c
  • -在匹配时在末尾修剪
    ,以防止在子树中搜索(假设
    2004/2004
    然后
    mv 2004/2004“2004/(2004)”
    或mv 2004/2004(2004)/2004将失败)

我发现Bash在查找和重命名文件时很烦人,因为需要进行所有转义操作。这是一个更干净的Ruby解决方案:

#!/usr/bin/ruby

require 'fileutils'

dirs = Dir.glob('./**/*').select {|x| x =~ / [0-9]*/ }

dirs.sort().reverse().each do |dir| 
    new_name=dir.gsub(/(.*)( )([0-9]{4})/, '\1\2(\3)')
    FileUtils.mv dir,new_name
end

<> > <代码> $f/COD>有一个以上的引导,for循环将它视为一个带有新行的长条目(尝试<代码>回音'F= [$F] )。 同时使用
-depth
,您可能有
topdir 2004/subdir 2004
。因此,首先重命名子曲面

当目录没有换行符时,您可以尝试

#!/bin/bash

while IFS= read -r orgdir; do
   mv "${orgdir}" "$(sed -r "s/([0-9]+$)/(\1)/g" <<< "${orgdir}")"
done < <(find . -depth -name '*[0-9]' -type d)
#/bin/bash
而IFS=read-r orgdir;做

mv“${orgdir}”“$(sed-r“s/([0-9]+$)/(\1)/g”是要重命名为递归的文件夹吗?类似于这样的结构:
str 123/str 456/
必须重命名为
str(123)/str(456)
?你需要
查找
选项,使它从最深的目录遍历目录,它在人类的某个地方……是的,这确实是个想法。
bash-c'for dir'…
对我来说很奇怪。与
-exec bash-c'mv“$1”“${1%[0-9][0-9][0-9]这样的单个进程相比,它是否节省了内存/执行速度(${1#${1%[0-9][0-9][0-9][0-9]}>”--{}\
?为了避免为每个mv启动一个批处理过程,应该执行基准测试以查看,但与您的注释不同,它不会重命名嵌套目录