3

我有一个包含以下文件的文件夹:

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 命令实现这一点?

4

4 回答 4

7

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用于创建新文件名,重新插入数字并用零填充。

于 2013-02-07T13:26:48.543 回答
2

您可以printf在 awk 中使用 's 选项打印四位数字:

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标志格式化其值(几乎等同于GNU Awk 用户指南#5.5.2 Format-Control Letters%d中看到的)。

于 2013-02-07T13:20:54.297 回答
2

肮脏但有效的黑客:

for i in $(seq 2345); do
    mv trackingData-00-$i.data trackingData-00-`printf %04d $i`.data;
done
于 2013-02-07T13:24:10.780 回答
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
于 2013-02-07T13:21:58.387 回答