使用计数器批量重命名 BASH 文件

使用计数器批量重命名 BASH 文件

我想将文件夹中的所有文件重命名为PREFIX+COUNTER+FILENAME

对于前。输入:

england.txt  
canada.txt  
france.txt

输出:

CO_01_england.txt  
CO_02_canada.txt  
CO_03_france.txt

答案1

这就是你所要求的:

n=1; for f in *.txt; do mv "$f" "CO_$((n++))_$f"; done

怎么运行的

  • n=1

    这会将变量初始化n为 1。

  • for f in *.txt; do

    这将启动一个循环,遍历当前目录中名称以.txt.

  • mv "$f" "CO_$((n++))_$f"

    这会将文件重命名为具有CO_前缀 withn作为计数器。该++符号告诉 bash 递增变量n

  • done

    这标志着循环的结束。

改进

此版本使用printf它可以更好地控制数字的格式:

n=1; for f in *.txt; do mv "$f" "$(printf "CO_%02i_%s" "$n" "$f")"; ((n++)); done

特别是,当数字仍为个位数时,该%02i格式将在数字前放置一个前导零。n

答案2

使用prenameDebian 及其衍生版本上的实用程序,或者通过安装 Perl 软件包在其他系统上使用该实用程序Unicode::Tussle:

prename 's ([^/]*\z) (sprintf("C0_%02d_%s", ++$n, $&))e' england.txt canada.txt france.txt

说明:对于每个参数,将基本名称(不包含斜杠的最长后缀)重命名为 ,后跟格式化为两位十进制数字的C0_计数器值(使用前递增,第一次递增和使用前从 0 开始),后接, 后接按原来的名字。要重命名具有扩展名的所有文件,并按字典顺序编号:$n_.txt

prename 's ([^/]*\z) (sprintf("C0_%02d_%s", ++$n, $&))e' *.txt

对于 zsh,使用zmv函数,以及参数扩展标志 l填充号码:

autoload -U zmv
zmv '*.txt' '$f:h/C0_${(l:2::0:)$((++x))}_$f:t'

相关内容