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


10

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

我目前正在尝试:

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

但是没有什么被重命名

我有一个父文件夹,其中有一堆子文件夹,这些文件是OneDrive认为将“(NEWER_timestamp)”附加到其上的一个好主意,我想删除它。

示例文件名:

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

2
您可以发布示例文件名吗?
muru 2014年

当然。有人更新了问题
凯文

Answers:


8

请尝试以下操作:

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
  • .*$将所有内容与$文件名末尾的空格匹配。
  • 最后,在重命名的替换部分中s/.../REPLACEMENT/,我们只保留了last \和与之匹配的空间之间的匹配组(.*)

2

您应该考虑使用正则表达式外的引号(在内部,它们实际上是引号),然后转义(。尝试;

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

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


这一切都挂在reading filenames from STDIN我已经在所有这些文件所在的“父”文件夹中
Kevin

@Kevin“如果命令行中未提供文件名,则将通过标准输入读取文件名。” 而且由于*NEWER*找不到任何扩展,shell会照原样保留,因此您一定犯了一个错误,或者使用的shell完全替换了不匹配的通配符。
muru

复制并粘贴到Ubuntu 14.10 shell中
Kevin
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.