1

我正在尝试重命名大量目录,以便用零填充它们。我正在尝试在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

另外,我不知道扩展名最大的目录504000是否会有6数字或更多或更少。

下面是一个非常奇怪的结果尝试(我收到消息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
4

2 回答 2

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
于 2013-01-18T09:54:01.797 回答
1

试试这个技巧:

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

问题是任何以 a 开头的数字0都被视为八进制。因此,虽然0005在八进制中与5十进制相同,但类似的字符串04800被视为八进制,但不幸的是包含一个8使其成为非法八进制数的字符串。

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

于 2013-01-18T07:31:43.543 回答