文件名修改

文件名修改

假设我有 1000 个文件,名称为 file1.txt...file1000.txt

如果数字可以被 10 整除,我需要更改文件名。

我这样做了,它只是改变了第一个字母

for f in *.txt; do mv -- "$f" "${f%.txt}.doc"; done

答案1

@Henrik supports the community的评论很贴切。另外,我始终是印刷要执行的命令,然后仔细检查这些命令。这为您提供了内置的“试运行”功能。 如果命令看起来正确,然后再次运行脚本并将输出通过管道传输到sh. OTOH,如果命令不正确,则不会造成任何损坏。

for f in *0.txt
do
    printf 'mv -- %q %q\n' "$f" "${f%.txt}.doc"
done

感谢 Stéphane Chazelas 建议更安全地使用printf's%q指令。

答案2

使用 perlrename实用程序(可能被命名为prenameperl-renamefile-rename具体取决于您运行的 UNIX 或 linux 发行版的类型)。

例如:

$ touch file{1..100}.txt
$ rename -n 'm/\w+(\d+)\.txt$/; if ($1 % 10 == 0) { s/\.txt$/.doc/ }' file*
rename(file100.txt, file100.doc)
rename(file10.txt, file10.doc)
rename(file20.txt, file20.doc)
rename(file30.txt, file30.doc)
rename(file40.txt, file40.doc)
rename(file50.txt, file50.doc)
rename(file60.txt, file60.doc)
rename(file70.txt, file70.doc)
rename(file80.txt, file80.doc)
rename(file90.txt, file90.doc)

此脚本执行正则表达式匹配以捕获捕获组 1 ( )rename之前的数字。然后,如果 $1 能被 10 整除,则通过修改..txt$1$_

注意:-n选项rename使其成为一次试运行,它仅打印将重命名的内容,而不实际重命名任何内容。要实际重命名文件,请-n从命令中删除 或将其替换-v为以获得详细输出。

顺便说一句,perlrename可以做的事情远不止这些。您可以使用任何有效的 perl 代码来重命名文件 - 如果代码更改$_(当前文件名),它将被重命名。如果不改变$_,就不会更名。它实际上是一种用于文件重命名操作的专用脚本语言。顺便说一句,rename除非您使用该选项强制它,否则不会重命名现有文件的文件名-f

例如,如果您还想重命名所有文件,以便将数字用零填充为 4 位数长,请添加s/\d+/sprintf("%04i",$&)/e到重命名脚本中:

$ rename -v 'm/\w+(\d+)\.txt$/;
             if ($1 % 10 == 0) { s/\.txt$/.doc/ };
             s/\d+/sprintf("%04i",$&)/e' file*
file100.txt renamed as file0100.doc
file10.txt renamed as file0010.doc
file11.txt renamed as file0011.txt
file12.txt renamed as file0012.txt
...
...
...
file98.txt renamed as file0098.txt
file99.txt renamed as file0099.txt
file9.txt renamed as file0009.txt

所有文件名都被重命名为零填充版本,其中一些文件名(数字可以被 10 整除的文件名)也被重命名为 doc。

答案3

这是一种可能的方法,应该有效并且可以节省执行时间。

for f in *.txt
  do 
    fname="${f%.*}"  # strip away the extension
    n="${fname//[^[:digit:]]/}" # keep only the digits
    if (( n % 10 == 0)); then  # use modulo to check if the remainder is 0 when n is devided
      echo mv -- "$f" "foo_${fname}".doc 
    fi
  done

为了理解上面的逻辑,让我们尝试一个数字 1..1000 的例子

n=({1..1000}); for n in "${n[@]}"; do if (( n % 10 == 0 )); then echo "$n <-- can be divided by 10"; fi; done

这将产生:

10 <-- can be divided by 10
20 <-- can be divided by 10
30 <-- can be divided by 10
....
....

相关内容