我有一堆编号格式不正确的文件:
prefix-#.ext | for files with number 1-9
prefix-##.ext | for files with number 10-99
prefix-###.ext | for files with number 100-999
由于进一步处理,我需要将它们的所有名称采用以下格式:prefix-###.ext
。有什么简单的方法可以做到这一点吗?
答案1
在 Debian、Ubuntu 及其衍生版本上,您可以使用rename
Perl脚本:
rename 's/(?<=-)([0-9]+)/sprintf "%03d", $1/e' prefix-*.ext
某些系统可能将此命令安装为prename
或perl-rename
。请注意,这不是rename
util-linux 套件中的实用程序,它没有提供执行此操作的简单方法。
在 zsh 中,您可以使用zmv
重命名和l
参数扩展标志用零填充。
autoload -U zmv
zmv '(prefix-)(*)(.ext)' '$1${(l:3::0:)2}$3'
您也可以使用普通的 shell 循环来完成此操作。 shell 没有很好的字符串操作结构;用零填充的一种方法是添加 1000 并去掉前导1
.
for x in prefix-*.ext; do
n=${x%.ext}; n=${x##*-}; n=$((n+1000))
mv "$x" "${x%-*.ext}${n#1}${x##*-}"
done
另一种方法是调用printf
实用程序。
for x in prefix-*.ext; do
n=${x%.ext}; n=${x##*-}
mv "$x" "${x%-*.ext}$(printf %03d "$n")${x##*-}"
done
答案2
也许是这样的(未经测试)
for n in *.ext; do
echo mv "$n" \
"prefix-$(printf %03d "$(basename ${n#prefix-} .ext)").ext"
done
删除 来echo
进行实际的重命名。
注意:您必须位于文件所在的目录中才能使此方法起作用;处理包含目录部分的路径名更为复杂。
答案3
for file in prefix-*.ext
do
num=`echo $file | sed 's/prefix-\(.*\).ext/\1/'`
[ $num -lt 100 ] && mv $file prefix-`printf "%03d" ${num}`.ext
done