如何将目录中的所有文件重命名为特定格式?

如何将目录中的所有文件重命名为特定格式?

我有一个目录,其中有很多这种格式的文件。以下只是我的两个文件的示例。

file_948_of_2000_push_data_12345.log
file_950_of_2000_push_data_12345.log

正如您所看到的,唯一的区别是该文件编号948950.现在我想以这种特定格式重命名所有这些文件,如下所示:

files_948.log
files_950.log

我能做到这一点的最好方法是什么?

答案1

使用 shell 参数扩展

$ for f in *.log; do g="${f/#file_/}"; echo mv -- "$f" "files_${g%%_*}.log"; done
mv -- file_948_of_2000_push_data_12345.log files_948.log
mv -- file_950_of_2000_push_data_12345.log files_950.log

使用基于 perl 的prenameorrename命令

$ prename -n -- 's/^(.*?)_(.*?)_.*\.log$/$1s_$2.log/' *.log
file_948_of_2000_push_data_12345.log renamed as files_948.log
file_950_of_2000_push_data_12345.log renamed as files_950.log

使用mmv

$ mmv -n '*_*_*.log' '#1s_#2.log'
file_948_of_2000_push_data_12345.log -> files_948.log
file_950_of_2000_push_data_12345.log -> files_950.log

根据需要删除-n或。echo

答案2

你可以尝试这个命令:

  ls -C1 file*log |  perl -ane 'chomp;$d=$_; s/^(\w+?)_(\d+?)_.*/$1s_$2.log/; print "mv -v $d $_\n";' | bash

Perl 脚本生成移动命令。关闭 bash 的管道,看看该命令是否执行您想要的操作。 perl 单行从标准输入读取文件列表,并匹配第一个单词,后跟下划线,后跟一组数字,然后打印移动命令。如果您需要 Linux 之外的其他应用程序,perl 可以简单地为您重命名该文件。注意事项。单行代码是原始的,不会处理带有路径的文件名。

相关内容