如何修改多个文件名?

如何修改多个文件名?

我将这些文件放在一个文件夹中:

1658286488_2022_07_21_15.1.2-ee_gitlab_backup.tar 
1658546417_2022_07_22_15.1.2-ee_gitlab_backup.tar 
2258286417_2022_07_23_15.1.2-ee_gitlab_backup.tar

我想标准化它们的名称,以便它们看起来像这样:

2022-07-21_15.1.2-ee_gitlab_backup.tar
2022-07-22_15.1.2-ee_gitlab_backup.tar
2022-07-23_15.1.2-ee_gitlab_backup.tar

我正在寻找一个简单的命令,例如 mv、rename 或类似的命令,因为我不太喜欢为此使用复杂的 bash 脚本。

答案1

由于您已经尝试过使用rename,因此这里是一个使用的解决方案rename(该实用程序的 Perl 版本是p5-File-Rename某些系统上的软件包的一部分):

rename -n -v -d 's/.*?_// && s/_/-/ && s/_/-/' *-ee_gitlab_backup.tar

上面的命令使用了三个替换:

  1. _第一次替换会删除文件名中第一个字符(包括第一个字符)之前的所有内容。 Perl 正则表达式.*?_将匹配从文件名开头到第一个下划线的任何内容。
  2. 第二次替换将_修改后的文件名中的第一个字符更改为-.
  3. 第三次替换是第二次替换的重复,这意味着下一个_字符也将更改为-

该命令不会执行任何操作,因为它是通过该-n选项调用的,因此如果您确定它会执行正确的操作,请将其删除。

-d如果您在其他目录中提供文件的完整路径,该选项将确保仅重命名路径的文件名部分。该-v选项启用详细操作。

如果您已成功删除文件名的第一部分(如你的评论之一),然后只需删除第一个替换:

rename -n -v -d 's/_/-/ && s/_/-/' *-ee_gitlab_backup.tar

答案2

使用sed

$ sed -E 's/^[^_]*_(.*\.tar)/mv & \1/' <(find /path/to/dir -type f -name '*.tar' -printf '%f\n')
mv 1658286488_2022_07_21_15.1.2-ee_gitlab_backup.tar 2022_07_21_15.1.2-ee_gitlab_backup.tar
mv 1658546417_2022_07_22_15.1.2-ee_gitlab_backup.tar 2022_07_22_15.1.2-ee_gitlab_backup.tar
mv 2258286417_2022_07_23_15.1.2-ee_gitlab_backup.tar 2022_07_23_15.1.2-ee_gitlab_backup.tar

如果在试运行期间重命名看起来正确,则您可以提交更改并执行命令。

$ sed -E 's/^[^_]*_(.*\.tar)/mv & \1/e' <(find /path/to/dir -type f -name '*.tar' -printf '%f\n')

相关内容