批量重命名文件夹中的文件

如何从文件夹中的文件名中删除一些文本?

我目前正在尝试:

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* 

表达式的精度可能没有必要,但在修改文件时不能过于谨慎。