如何重命名多个目录?

如何重命名多个目录?

这是我的目录:

P [001]
P [002]
P [003]

我想重命名为:

P001
P002
P003

我使用了代码:

for P in *\ *; do mv '$P' '${P// /_}'; done

但我缺少一些东西。

答案1

尝试prename

$ ls
P [001]  P [002]  P [003]
$ prename 's/[ \[\]]//g' P\ *
$ ls
P001  P002  P003
$

'或者,坚持使用原来的脚本方法(对to进行细微调整"并对正则表达式进行细微更改)

$ ls
P [001]  P [002]  P [003]
$ for P in *\ *; do mv "$P" "${P//[\[\] ]/}" ; done
$ ls
P001  P002  P003
$

答案2

请注意目录是否在彼此内部,换句话说,如果您递归地执行此操作,则上述答案均无效(也许prename有效,我不确定)。例如:

P [1]
   |___P [10]
   |___P [11]
         |___P [112]
         |___other
               |___P [113]
P [21]
P [132]

您可以在不安装任何软件包的情况下使用它:

find . -type d -name 'P [*' -printf "echo mv \'%h/%f\' \'%h/\$(echo %f | sed \"s/[][ ]//g\")\'\n" | sort -r | sh

用于测试和进行实际工作:

find . -type d -name 'P [*' -printf "mv \'%h/%f\' \'%h/\$(echo %f | sed "s/[][ ]//g\")\'" | sort -r | sh

说明:查找当前文件夹 ( find .) 并找到-type d名称与 ( ) 匹配的所有目录 ( ) 并打印将传递到执行的- name 'P [*'命令。将 %h 和 %f 替换为找到的文件的路径和名称。该部分要求命令将所有文件名 ( ) 中的( ) 方括号和空格 ( [ ] )替换为空 ( ) 。重要的是在运行这些命令之前对它们进行反向排序 ( ) ( ),否则您可能在重命名其子文件夹之前重命名了父文件夹,并且命令失败。shprintf$(echo %f | sed 's/[][ ]//g')seds/][//g| sort -r| sh

希望它有用。

编辑:由于@AdminBee修复了名称中的空格问题

答案3

您与下面的内容接近以删除空格(实际上您正在用下划线替换),但是您需要使用双引号而不是单引号,这将防止变量扩展。

此外,您还应该知道,由于您没有验证P变量是目录还是文件,因此您可能会重命名文件。

for P in *\ *;
do
    [ -d "$P" ] && mv "$P" "${P// /_}" || echo 'skipping, the'"$P"' is not a directory'
done

您还可以执行以下操作来删除所有空格/括号:

find -maxdepth 1 -type d -name 'P*' -exec bash -c 'echo ${1} ${1//[][ ]}' bash {} \;
./P [001] ./P001
./P [002] ./P002
./P [003] ./P003

答案4

首先你应该使用双引号$P

即使不是单个命令,以下内容也应该完成这项工作:

for P in *\ *; do rename "s/ //g" * && rename "s/[][]//g" *; done

第一个重命名删除空格,第二个重命名删除方括号

相关内容