使用bash重命名用零填充的目录

时间:2013-01-18 07:22:31

标签: bash

我正在尝试重命名大量目录,以便用零填充它们。我试图在包含workingDir目录的目录viz中运行bash脚本。在viz目录中,我有目录

visit_dump.0001
visit_dump.0005 visit_dump.11000 visit_dump.12000 visit_dump.504000

如何将它们重命名为以下内​​容?

visit_dump.000001
visit_dump.000005 visit_dump.011000 visit_dump.012000 visit_dump.504000

另外,我不知道扩展名最大的目录,5040006个数字还是更多或更少。

下面是一个非常奇怪的结果尝试(我收到消息printf: 04800: invalid octal number 并且它完全分配了目录的错误扩展名。任何帮助将不胜感激。谢谢。

eulerDir=visit_dump

dataDir=viz

cd ./$dataDir

for eulerDirIter in $(ls -d $eulerDir.*); do
    number=$(echo $eulerDirIter |awk -F . '{print $NF}')
    $(mv $eulerDirIter $(printf $eulerDir.%06d $number));
done

2 个答案:

答案 0 :(得分:3)

在第一行中查找最大的数字扩展名,并将每个数字处理为十进制而不是八进制:

max=$(for f in *; do echo "${f##*.}"; done | sort -n | tail -1)
for f in *; do
    base=${f%.*}
    ext=${f##*.}
    newext=$(printf "%0*d" ${#max} "$((10#$ext))")
    echo mv "$f" "$base.$newext"
done

答案 1 :(得分:1)

试试这个黑客:

awk -F . '{print $NF+0}'

问题是任何以0开头的数字都被视为八进制。因此,虽然八进制中的00055十进制相同,但像04800这样的字符串被视为八进制,但不幸的是包含8,这使得它成为非法的八进制数。 / p>

您使用awk -F . '{print $NF}'来获取目录的数字后缀,但是您希望将它们视为数字,因此将字符串04800转换为数字的简单方法是简单地添加{ {1}}。 (0不会将awk视为八进制。)