cworner1 Asked: 2018-06-16 05:12:30 +0800 CST2018-06-16 05:12:30 +0800 CST 2018-06-16 05:12:30 +0800 CST 使用rename命令重命名多个目录,名称涉及括号 772 我有一个在标签末尾标有“(完成)”的目录列表。 例如:“文件夹 1(完成)” 我希望使用重命名命令从每个目录中删除“(完成)”。因为它是一个特殊字符,所以我使用转义字符。 rename s/\(Done\)//g * 但是,此命令不起作用。它删除了“完成”一词并留下了括号:“文件夹 1 ()” bash rename 3 个回答 Voted Best Answer Stéphane Chazelas 2018-06-16T05:44:26+08:002018-06-16T05:44:26+08:00 \是 shell 语法中的引用运算符,因此: rename s/\(Done\)//g * 与运行相同: rename 's/(Done)//g' * 和(,)是 perl 正则表达式语法(rename使用)中的特殊字符,需要加上前缀\(或更改为[(]and [)])以便按字面意思对待它们。 所以在这里,你想要: rename 's/\s*\(Done\)//g' ./* 此处还添加\s*以删除 之前(Done)的任何空格,以及./前缀,因为某些变rename体会阻塞以 . 开头的文件名-。 lese 2018-06-16T05:39:23+08:002018-06-16T05:39:23+08:00 这应该工作: rename 's/\(.*\)|\[.*\]//g' * 否则不使用rename命令(OT): for file in folder*; do mv "$file" "${file/\(Done\)/}" done Kusalananda 2018-06-16T06:10:38+08:002018-06-16T06:10:38+08:00 使用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
\
是 shell 语法中的引用运算符,因此:与运行相同:
和
(
,)
是 perl 正则表达式语法(rename
使用)中的特殊字符,需要加上前缀\
(或更改为[(]
and[)]
)以便按字面意思对待它们。所以在这里,你想要:
此处还添加
\s*
以删除 之前(Done)
的任何空格,以及./
前缀,因为某些变rename
体会阻塞以 . 开头的文件名-
。这应该工作:
否则不使用
rename
命令(OT):使用
find
:这用于
find
挑选出␣(Done)
名称末尾的目录,然后使用标准参数替换来删除该字符串。不进行检查以确保同一目录中不存在具有目标名称的目录/文件。
上面的
sh -c
脚本显然也可以自己运行,只需稍作修改即可进行测试find
: