【问题标题】:Replace/substitute characters for file renaming in Bash [duplicate]替换/替换 Bash 中文件重命名的字符 [重复]
【发布时间】:2019-01-02 18:22:20
【问题描述】:

我在一个目录中有以下文件名:

file_foo_01_2010.nc
file_foo_02_2010.nc
...
file_foo_12_2018.nc

我想一次将它们全部重命名为:

file_foo_2010_01.nc
file_foo_2010_02.nc
...
file_foo_2018_12.nc

我知道我可以遍历 bash 脚本中的每个文件并这样做,但我想知道是否有更简洁的方法来做到这一点?比如:

mv file_foo_12_201?.nc file_foo_201?_12.nc

重命名每个 12 月文件等。

我本质上想将字符 9-10 与 12-15 切换,但不确定如何使用 bash 执行此操作。我知道rename,但不确定它是否可以用于我的用例。

【问题讨论】:

  • 不确定副本是否准确回答了我的问题?我告诉你如何替换字符串,但不告诉你如何替换我需要的字符。
  • 是的,确实如此。您想使用一种允许您使用正则表达式的工具,例如“重命名”。您需要使用两个捕获组,一个用于两个数字模式中的每一个。
  • 嗯..好的。阅读了所有欺骗性的问题和答案后,我仍然不明智,仅感谢下面的答案,我才有了解决方案。我知道我必须使用rename 或类似名称,但在理解/如何执行欺骗答案未完全解释的“捕获组”方面苦苦挣扎。

标签: bash rename


【解决方案1】:

使用 Perl 的rename:

$ rename -n 's/(_[^_]+)(_[^_]+).nc$/$2$1.nc/' *.nc
rename(file_foo_01_2010.nc, file_foo_2010_01.nc)
rename(file_foo_12_2018.nc, file_foo_2018_12.nc)

如果您对结果满意,请删除-n

【讨论】:

  • 谢谢 - 为我工作。您能否解释一下答案中的(_[^_]+)(_[^_]+) 部分,然后我可以接受?
猜你喜欢
  • 2017-04-01
  • 2014-04-26
  • 2018-12-31
  • 1970-01-01
  • 2017-01-21
  • 1970-01-01
  • 1970-01-01
  • 2018-08-30
  • 1970-01-01
相关资源
最近更新 更多