我将这些文件放在一个文件夹中:
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
上面的命令使用了三个替换:
_
第一次替换会删除文件名中第一个字符(包括第一个字符)之前的所有内容。 Perl 正则表达式.*?_
将匹配从文件名开头到第一个下划线的任何内容。- 第二次替换将
_
修改后的文件名中的第一个字符更改为-
. - 第三次替换是第二次替换的重复,这意味着下一个
_
字符也将更改为-
。
该命令不会执行任何操作,因为它是通过该-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')