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

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

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

我目前正在尝试:

rename s/"NEWER_(.*?)"//g *

但没有什么被重新命名

我有一个父文件夹,里面有一堆子文件夹,里面都是文件,OneDrive 认为在其上附加“ (NEWER_timestamp)”是个好主意,但我想将其删除。

文件名示例:

getyou.ico (NEWER_1417529079.87)
o7pm.ico (NEWER_1417529184.89)
o7th.ico (NEWER_1417529135.81)

答案1

请尝试以下操作:

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
  • All[^/]*(.*) .*$仅匹配路径中不包含 的最后一部分/。并且
  • 在上面的正则表达式中,是一组匹配最后一个 之后和空格 之前的(.*)所有内容的组。它的反向引用将是。/$1
  • .*$$匹配文件名末尾空格后的所有内容。
  • 最后,在重命名的替换部分,我们只保留最后一个和一个空格s/.../REPLACEMENT/之间的匹配组,称为匹配组。\(.*)

答案2

您应该考虑在正则表达式之外使用引号(在内部,它们将被视为引号),然后转义(。尝试;

rename -n 's/ \(NEWER_\d{10}.\d{2}\)$//' *NEWER*

表达的精确度可能不是必需的,但是在修改文件时不能太谨慎。

相关内容