批量重命名文件夹中的文件
如何从文件夹中的文件名中删除一些文本?
我目前正在尝试:
rename s/"NEWER_(.*?)"//g *
但没有任何重命名
我有一个父文件夹,其中包含一堆子文件夹,OneDrive认为添加“(NEWER_timestamp)”是一个好主意,我想删除它。
示例文件名:
getyou.ico (NEWER_1417529079.87) o7pm.ico (NEWER_1417529184.89) o7th.ico (NEWER_1417529135.81)
请尝试以下方法:
find /path/to/parrent-dir -type f -exec rename -n 's:[^/]*(.*) .*$:$1:' {} + ./o7th.ico (NEWER_1417529135.81) renamed as /o7th.ico ./sub-dir (NEWER_1417529135.81)/getyou.ico (NEWER_1417529079.87) renamed as /sub-dir (NEWER_1417529135.81)/getyou.ico ./sub-dir (NEWER_1417529135.81)/o7pm.ico (NEWER_1417529184.89) renamed as /sub-dir (NEWER_1417529135.81)/o7pm.ico ./getyou.ico (NEWER_1417529079.87) renamed as /getyou.ico ./o7pm.ico (NEWER_1417529184.89) renamed as /o7pm.ico
- 所有
[^/]*(.*) .*$
仅匹配不包含/
的路径的最后部分。 和 - 在上面的正则表达式中,
(.*)
是一组在最后/
和空格之前匹配所有内容。 它的反向引用将是
$1
。 -
.*$
匹配所有内容以结束$
space之后的文件名。 - 最后在重命名
s/.../REPLACEMENT/
替换部分中,我们保留了匹配的组,它位于最后一个空格(.*)
,称为匹配组。
您应该考虑使用正则表达式之外的引号(在内部,它们被字面上称为引号),并且转义(
。
rename -n 's/ \(NEWER_\d{10}.\d{2}\)$//' *NEWER*
表达式的精度可能没有必要,但在修改文件时不能过于谨慎。