我正在尝试重命名大量目录,以便用零填充它们。我试图在包含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
答案 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
开头的数字都被视为八进制。因此,虽然八进制中的0005
与5
十进制相同,但像04800
这样的字符串被视为八进制,但不幸的是包含8
,这使得它成为非法的八进制数。 / p>
您使用awk -F . '{print $NF}'
来获取目录的数字后缀,但是您希望将它们视为数字,因此将字符串04800
转换为数字的简单方法是简单地添加{ {1}}。 (0
不会将awk
视为八进制。)