私のディレクトリには次のファイルがあります。
$ ls *
-008.png 0052.png -002.jpg 0043.png -005.png 0044.png ...
ファイルをサブディレクトリにコピーしsubdir
(既存のファイルを上書きせずに)、ファイル名に指定された数字(10など)を追加してファイル名を変更したいと思います。
$ ls subdir/*
0002.png 0062.png 0008.jpg 0053.png 0005.png 0054.png ...
これは私のbashコマンドです
for filename in *
do
basename=${filename%.*}
extname=${filename#*.}
basename_new=$(printf %04d $((10#${basename}+10))); # 10#-008: value too great for base (error token is "003")
if [ ! -e subdir/"$basename_new".* ]; # [: subdir/.: binary operator expected
cp "$filename" "$basename_new"."$extname"
fi
done
ネガティブな名前を持ついくつかのファイルでは、forと同じエラーが発生します-008.png
(しかしforではない-002.png
、理由はわかりません)。
次に割り当てられた行の場合basename_new
:
10#-008: value too great for base (error token is "008")
次の行の場合if
:
# [: subdir/.: binary operator expected
このエラーが何を意味するのか知りたいです。どうすれば解決できますか?
ありがとうございます。
ベストアンサー1
ダッシュで始まる単語は通常オプションと見なされます。これにより、ls *
コマンドは理解できない一連のオプションを受け取り、ls
処理ls 001.png -002.png ...
します。 、、...-002.png
などの多くのコマンドでも同様です。cp
mv
解決策1:ファイルの前にパスを付けます。すべての場合に有効です。
ls ./*
解決策#2:特にGNUの世界の多くのコマンドは、二重ダッシュを引数として受け入れ、次のものがオプションではないことを示しています。
ls -- *
ただし、先行ダッシュはループには影響しませんfor
。
「値が下数に比べて大きすぎる」というのは、-008
0から始めて8進数として扱われるからです。ただし、8は有効な8進数ではありません。クイックフィックスは次のことですbc
。
printf -v basename_new %04d "$(bc <<< "${basename} + 10")"
問題はif
nullが原因で発生basename_new
し、上記の修正で消えます。