使用rename命令重命名多个目录,名称涉及括号

使用rename命令重命名多个目录,名称涉及括号

我有一个在标签末尾标有“(完成)”的目录列表。

例如:“文件夹 1(完成)”

我希望使用重命名命令从每个目录中删除“(完成)”。因为它是一个特殊字符,所以我使用转义字符。

rename s/\(Done\)//g *

然而,这个命令不起作用。它删除了“完成”一词并留下括号:“文件夹 1 ()”

答案1

\是 shell 语法中的引用运算符,因此:

rename s/\(Done\)//g *

与运行相同:

rename 's/(Done)//g' *

(,)是 perl 正则表达式语法(rename使用)中的特殊字符,需要使用前缀\(或更改为[(][)]),以便按字面意思处理它们。

所以在这里,你想要:

rename 's/\s*\(Done\)//g' ./*

这里还添加了\s*删除之前的任何空格(Done)./前缀,因为 的某些变rename体会阻塞以 开头的文件名-

答案2

这应该有效:

rename 's/\(.*\)|\[.*\]//g' *

否则不使用rename命令(OT):

for file in folder*; do                                                          
    mv "$file" "${file/\(Done\)/}"
done

答案3

使用find

find topdir -maxdepth 1 -type d -name '* (Done)' -exec sh -c '
    for pathname do
        mv "$pathname" "${pathname%" (Done)"}"
    done' sh {} +

这用于挑选名称末尾的find目录,然后使用标准参数替换来删除该字符串。␣(Done)

不会进行检查以确保同一目录中不存在具有目标名称的目录/文件。


上面的脚本sh -c显然也可以单独运行,只需稍作修改即可进行测试find

for pathname in topdir/*' (Done)'/; do
    mv "$pathname" "${pathname%' (Done)/'}"
done

相关内容