負の名前のファイル名のパラメータ拡張エラー

負の名前のファイル名のパラメータ拡張エラー

私のディレクトリには次のファイルがあります。

$ 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などの多くのコマンドでも同様です。cpmv

解決策1:ファイルの前にパスを付けます。すべての場合に有効です。

ls ./*

解決策#2:特にGNUの世界の多くのコマンドは、二重ダッシュを引数として受け入れ、次のものがオプションではないことを示しています。

ls -- *

ただし、先行ダッシュはループには影響しませんfor


「値が下数に比べて大きすぎる」というのは、-0080から始めて8進数として扱われるからです。ただし、8は有効な8進数ではありません。クイックフィックスは次のことですbc

printf -v basename_new %04d "$(bc <<< "${basename} + 10")"

問題はifnullが原因で発生basename_newし、上記の修正で消えます。

おすすめ記事