如何重命名文件以排除日期时间戳?

如何重命名文件以排除日期时间戳?

我想要一个可以重命名文件的正则表达式。Microsoft Windows 已更改我的文件的名称,我想从文件名中删除括号中的日期时间子字符串。

以下是一些示例文件名:

icon-culture (2015_09_04 06_58_44 UTC).png
icon-disk (2015_09_04 06_58_44 UTC).png
icon-download (2015_09_04 06_58_44 UTC).png
icon-drop (2015_09_04 06_58_44 UTC).png
icon-file (2015_09_04 06_58_44 UTC).png
icon-film (2015_09_04 06_58_44 UTC).png
icon-flag (2015_09_04 06_58_44 UTC).png
icon-folder (2015_09_04 06_58_44 UTC).png
icon-garbage (2015_09_04 06_58_44 UTC).png
icon-graph (2015_09_04 06_58_44 UTC).png
icon-heart (2015_09_04 06_58_44 UTC).png
icon-help (2015_09_04 06_58_44 UTC).png
icon-lock (2015_09_04 06_58_44 UTC).png
icon-map (2015_09_04 06_58_44 UTC).png
icon-media (2015_09_04 06_58_44 UTC).png
icon-money (2015_09_04 06_58_44 UTC).png
icon-monitor (2015_09_04 06_58_44 UTC).png
icon-notes (2015_09_04 06_58_44 UTC).png
icon-openmail (2015_09_04 06_58_44 UTC).png
icon-phone (2015_09_04 06_58_44 UTC).png
icon-photo (2015_09_04 06_58_44 UTC).png

重命名后我想要的文件名是:

icon-culture.png
icon-disk.png
icon-download.png
icon-drop.png
icon-file.png
icon-film.png
icon-flag.png
icon-folder.png
icon-garbage.png
icon-graph.png
icon-heart.png
icon-help.png
icon-lock.png
icon-map.png
icon-media.png
icon-money.png
icon-monitor.png
icon-notes.png
icon-openmail.png
icon-phone.png
icon-photo.png

我发现的教程对我来说不太好,因为其中包含一些特殊字符和数字。

答案1

您可以使用rename命令:

$ rename -n 's/ \(.*?\)//' *.png
icon-culture (2015_09_04 06_58_44 UTC).png renamed as icon-culture.png
icon-disk (2015_09_04 06_58_44 UTC).png renamed as icon-disk.png
icon-download (2015_09_04 06_58_44 UTC).png renamed as icon-download.png
icon-drop (2015_09_04 06_58_44 UTC).png renamed as icon-drop.png
icon-file (2015_09_04 06_58_44 UTC).png renamed as icon-file.png
icon-film (2015_09_04 06_58_44 UTC).png renamed as icon-film.png
icon-flag (2015_09_04 06_58_44 UTC).png renamed as icon-flag.png
icon-folder (2015_09_04 06_58_44 UTC).png renamed as icon-folder.png
icon-garbage (2015_09_04 06_58_44 UTC).png renamed as icon-garbage.png
icon-graph (2015_09_04 06_58_44 UTC).png renamed as icon-graph.png
icon-heart (2015_09_04 06_58_44 UTC).png renamed as icon-heart.png
icon-help (2015_09_04 06_58_44 UTC).png renamed as icon-help.png
icon-lock (2015_09_04 06_58_44 UTC).png renamed as icon-lock.png
icon-map (2015_09_04 06_58_44 UTC).png renamed as icon-map.png
icon-media (2015_09_04 06_58_44 UTC).png renamed as icon-media.png
icon-money (2015_09_04 06_58_44 UTC).png renamed as icon-money.png
icon-monitor (2015_09_04 06_58_44 UTC).png renamed as icon-monitor.png
icon-notes (2015_09_04 06_58_44 UTC).png renamed as icon-notes.png
icon-openmail (2015_09_04 06_58_44 UTC).png renamed as icon-openmail.png
icon-phone (2015_09_04 06_58_44 UTC).png renamed as icon-phone.png
icon-photo (2015_09_04 06_58_44 UTC).png renamed as icon-photo.png

s/ \(.*?\)//是一个简单的表达式,虽然范围很广,但它匹配空格后跟括号括起来的内容。你可以选择更精确的表达式,例如:

  • s/ \(.*?\)\.png$/.png/- 与上一个类似,但仅当后面跟着.png文件名的结尾时才匹配,或者
  • s/ \(\d{4}(_\d\d){2} \d\d(_\d\d){2} UTC\)\.png/.png/- 匹配这些文件中显示的日期模式,然后.png

-n选项用于测试命令。如果您对结果满意,则无需该选项即可运行。

答案2

使用bash参数扩展:

for file in *.png; do mv -i "$file" "${file%% *}".png; done

${file%% *}将丢弃文件名中从空格开始的不需要的部分。然后在 -ing.png时将扩展名添加到文件名后面mv

答案3

你可以尝试以下 Python 代码片段

import os
import glob
files = glob.glob('*')
for file in files:
    var1 = file.find(' (')
    var2 = file.find(')')+1
    filename = file[:var1] +  file[var2:]
    os.rename(file, filename)
  • glob 查找满足正则表达式参数的所有文件
  • 您遍历列表并修改文件的名称
  • rename更改文件的名称

答案4

假设目录中的所有文件都需要接受相同的处理(换句话说,这是一个字符串提取任务,而不是字符串验证任务),这里是@muru 解决方案的替代方案,它融合了我从中汲取的一些智慧@CandyGumdrop 的全面 Stackoverflow 答案我对正则表达式优化的理解是:

prename 's/ [^.]*//' *

该模式依赖于一致的子字符串结构,该结构以文件名中唯一的空格字符开头,然后贪婪地消耗所有不是文字点的字符。匹配这些字符后,替换字符串将为零宽度字符串(换句话说,用空字符替换)。如果您想插入任何字符来代替匹配的子字符串,则这些字符将写在两个连续的正斜杠之间。

命令末尾的*表示包含目录中的所有文件。如果您的文件类型将来可能会有所不同,这可能会很有用。

衡量正则表达式模式效率的一个指标是正则表达式引擎必须采取的步骤数。 https://regex101.com在阐明模式逻辑和呈现步数方面做得很好。

https://regex101.com/r/JeB581/1/表明需要64对您提供的文件名进行 21 次替换的步骤。

https://regex101.com/r/JeB581/2/表明@muru 的模式需要588步骤执行相同的21个替换。

如果您的文件数量相对较小,则完全没有理由对性能吹毛求疵。我只是想指出如何通过利用贪婪量词(*?)与惰性量词(.*)来优化模式(如果/当它有益时)。陈述模式差异的另一种方式是,我牺牲了字符串验证强度以加快匹配速度。

相关内容