我有一个在标签末尾标有“(完成)”的目录列表。
例如:“文件夹 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