这是我的目录:
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 替换为找到的文件的路径和名称。该部分要求命令将所有文件名 ( ) 中的( ) 方括号和空格 ( [ ] )替换为空 ( ) 。重要的是在运行这些命令之前对它们进行反向排序 ( ) ( ),否则您可能在重命名其子文件夹之前重命名了父文件夹,并且命令失败。sh
printf
$(echo %f | sed 's/[][ ]//g')
sed
s/
][
//
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
第一个重命名删除空格,第二个重命名删除方括号