我想将文件夹中的所有文件重命名为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
使用prename
Debian 及其衍生版本上的实用程序,或者通过安装 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'