数字文件名补零

在运行此命令之前,请确保备份您的文件,以防意外情况发生。

find . -type f -name "*.ts" -exec rename -v 's/([0-9]+)/sprintf("%05d",$1)/e' {} \; 

这个命令将在当前目录及其子目录中查找所有以".ts"为扩展名的文件,并将其重命名为包含五位数值的格式。


点击查看命令解释
命令解释如下:

  • find .: 表示在当前目录中开始搜索文件。
  • -type f: 表示只匹配文件类型为普通文件的项,而不是目录或其他特殊文件。
  • -name "*.ts": 表示只匹配以 ".ts" 为扩展名的文件。
  • -exec: 对于每个匹配的文件执行后续命令。
  • rename 's/([0-9]+)/sprintf("%05d",$1)/e' {} \;: 对找到的文件执行 rename 命令进行重命名操作。

rename 命令使用正则表达式将文件名中的数字部分替换为包含五位数值的格式。

  • s/([0-9]+)/sprintf("%05d",$1)/e:这是一个正则表达式替换命令的模式。

    • ([0-9]+): 匹配一个或多个数字。
    • sprintf("%05d", $1): 使用 sprintf 函数将匹配到的数字格式化为五位数值。
    • /e: 将替换操作作为 Perl 代码执行。

{} 表示找到的文件名作为参数传递给 -exec 中的命令。
\; 表示命令结束的标记。

在标准的Unix/Linux系统中没有内置的rename命令。如果您要实现类似的重命名操作,可以使用mv命令结合shell脚本来完成。

find . -type f -name "*.ts" -exec bash -c 'f="{}"; num=$(echo "$f" | grep -oE "[0-9]+"); padded_num=$(printf "%05d" $num); mv "$f" "${f//${num}/${padded_num}}" ' \;

请务必对命令的安全性和适用性进行全面测试。


点击查看命令解释
这段单行Bash脚本的工作原理是:
find . -type f -name "*.ts":在当前目录及其子目录下查找所有.ts类型的文件。
-exec bash -c:对于每个找到的文件,执行一个新的Bash shell命令。
f="{}"; num=$(echo "$f" | grep -oE "[0-9]+"):将当前文件路径赋给变量f,并通过grep提取文件名中的数字部分并赋给变量num。
padded_num=$(printf "%05d" $num):使用printf将提取到的数字转换为长度至少为5位的零填充数字,并赋给变量padded_num。
mv "$f" "${f//${num}/${padded_num}}":使用Shell的参数扩展功能,将原始文件名中找到的数字字符串$num替换为零填充后的数字$padded_num,然后执行mv命令重命名文件。