【问题标题】:Regex to rearrange filename strings?正则表达式重新排列文件名字符串?
【发布时间】:2012-01-09 01:58:35
【问题描述】:

我需要重命名大约 50,000 个文件,但找不到有效的正则表达式示例。这是所有文件名的模式

myfiletitle.jpg_download=12500

文件名末尾的数字 ID 都是相同的长度 - 5 位 - 并且所有文件名都遵循这种模式。在 Bash shell 中,我想运行批量重命名来重组文件名,如下所示:

12500_myfiletitle.jpg

这应该很容易,但我无法让正则表达式工作。我在以下方面取得了一些成功,但总的来说我无法获得完整的解决方案:

s/\(.*\).../\1/

提前致谢!!

【问题讨论】:

  • 您打算使用哪个工具? sedperl 或 ...?
  • 使用软件名称 BULK RENAME UTILITY......... 有史以来最好的批处理文件重命名软件......即使是数千个文件......

标签: regex rename


【解决方案1】:
s/\(.*)\.jpg_download=\([0-9]\{5\}\)$/\2_\1.jpg/

这是使用sed-like 正则表达式,正如问题的说明性正则表达式中所暗示的那样。在 Perl 中,你会写:

s/(.*)\.jpg_download=(\d{5})$/$2_$1.jpg/

【讨论】:

  • 谢谢!这是我使用的最后一个字符串:ls | sed 's/\(.*\)\.JPG_download=\([0-9]\{6\}\)$/mv -- & \2_\1.jpg/' | sh,其中目录中的所有文件都是 JPG。结果证明 JPG 和 jpg 的大小写不同,一些 ID 是六位数而不是五位数,一些文件名以“-”开头。我刚刚编辑了命令并重新运行了几次。
  • 这样的迭代解决方案对于一次性流程来说是明智且可行的。它就像是敏捷编程的极致。如果您必须经常进行更改,那么值得设计一个脚本来一次性处理所有的偏差和变化。
【解决方案2】:

如果您要保留的两个部分始终由 '_download=' 分隔,则:

sed 's/\(.*\)_download=\(.*\)/\2_\1/'

【讨论】:

    猜你喜欢
    • 2012-12-18
    • 1970-01-01
    • 2012-09-25
    • 2012-02-17
    • 1970-01-01
    • 1970-01-01
    • 2020-04-22
    • 1970-01-01
    • 2023-03-29
    相关资源
    最近更新 更多