我有一个包含以下文件的文件夹:
trackingData-00-1.data, trackingData-00-2.data, ..., trackingData-00-2345.data
我想通过格式化4位数字
来重命名它们trackingData-00-0001.data, trackingData-00-0002.data, ..., trackingData-00-2345.data
如何使用bash shell命令实现这一目标?
答案 0 :(得分:6)
纯bash
解决方案:
for f in trackingData-00-*.data; do
[[ $f =~ trackingData-00-([0-9]+).data ]]
mv "$f" $(printf "trackingData-00-%04d.data" ${BASH_REMATCH[1]})
done
正则表达式提取要填充的数字并将其存储在BASH_REMATCH
数组中。然后printf
用于创建新文件名,重新插入数字并用零填充。
答案 1 :(得分:2)
您可以在awk中使用printf
选项打印四位数字:
echo 3 | awk '{printf ("%04i", $1)}'
0003
echo 33 | awk '{printf ("%04i", $1)}'
0033
所以它可能是:
for file in trackingData*
do
num=$(awk -F[.-] '{printf ("%04i", $3)}' <<< "$file")
mv $file trackingData-00-$num.data
done
这会将awk
与两个字段分隔符一起使用:.
或-
。然后,它将基于它们获取第3个块,并使用%04i
标记格式化其值(几乎等同于The GNU Awk User’s Guide #5.5.2 Format-Control Letters中所见的%d
)。
答案 2 :(得分:2)
肮脏但正在工作的黑客:
for i in $(seq 2345); do
mv trackingData-00-$i.data trackingData-00-`printf %04d $i`.data;
done
答案 3 :(得分:1)
首先,我假设您的文件名中没有空格。然后
ls/find...| awk -F'-|\\.' '{o=$0;$3=sprintf("%04d",$3);$4=".data";gsub(/-\./,".");print "mv "o" "$0}' OFS='-'
将打印mv ...
命令。要执行它们,只需将输出传递给sh
,如
ls...|awk ..|sh
核心是awk部分,测试一下:
kent$ echo "trackingData-00-1.data
trackingData-00-2.data"|awk -F'-|\\.' '{o=$0;$3=sprintf("%04d",$3);$4=".data";gsub(/-\./,".");print "mv "o" "$0}' OFS='-'
mv trackingData-00-1.data trackingData-00-0001.data
mv trackingData-00-2.data trackingData-00-0002.data