1

ゼロで埋められるように、多数のディレクトリの名前を変更しようとしています。workingDirディレクトリを含むディレクトリでbashスクリプトを実行しようとしていますvizvizディレクトリには、ディレクトリがあります

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

最初の行で最大の数値拡張子を見つけ、各数値を 8 進数ではなく 10 進数として処理します。

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 で始まる数値が08 進数として扱われることでした。したがって0005、8 進数は 10 進数と同じですが、5のような文字列04800は 8 進数として扱われますが、残念ながら が含まれて8いるため、不正な 8 進数になります。

ディレクトリの数字のサフィックスを取得するために使用awk -F . '{print $NF}'しますが、それらを数字として扱いたいので、文字列04800を数字に変換する簡単な方法は、単純に追加0することです。(は8 進数としてawk扱われません)。04800

于 2013-01-18T07:31:43.543 に答える