Bashで変数/配列(ファイル名を含む)を使用するときにファイル名の引用符を検出する方法は? [コピー]

Bashで変数/配列(ファイル名を含む)を使用するときにファイル名の引用符を検出する方法は? [コピー]

私は数日間bashスクリプトを操作してきましたが、一重引用符と二重引用符を含むファイル名が付いています。ディレクトリ内の次のファイルを繰り返したいと思います。

'file1.txt'
'file2.txt'
"file3.txt"
file"3.txt
file'4.txt
very 'bad file.txt
also "very bad.txt

私はこれが間違ったファイル命名であることを知っています。しかし、誰もがプログラマではなく、ファイル名を正しく指定する方法を知っているわけではありません。だから私はこの極端なケースを処理しようとします。

このファイルを繰り返して、次のif文で使用したいと思います。

dir="my/dir/"
files="$(ls -N "$dir"*)"

shopt -s extglob

for f in $files; do
  if [[ "$files" =  *"(*.png|*.jpg|*.jpeg|*.JPG|*.JPEG|*.webp)" ]]; then
    for $e in "$files"; do
      cp "$e" "$dir""somefilename.pdf"
    else
      cp "$f" "$dir""somefilename.pdf"
  fi
done

これで問題が発生します。 bashはファイル名の二重引用符と一重引用符を解釈し、ファイルを分割します。エラーが発生しました...

だから私の質問は:bashでこれらの状況をどのように処理しますか?

ベストアンサー1

出力を解析しないでくださいls。それは狂気といろいろな種類の対立である。特定のディレクトリ内のすべてのファイルに対して操作を実行したい場合は、シェルにファイル名を処理させます。

workdir="/path/to/directory"
for file in "${workdir}"/*; do
    case "$file" in
        *.png|*.jpg|*.jpeg|*.JPG|*.JPEG|*.webp)
            cp -- "$file" "$dir"/"somefilename.pdf"
            ;;
    esac
done

somefile.pdf一致するすべてのファイルを繰り返し上書きするあいまいなロジックを持つ質問から直接述部をインポートしましたが、おそらくあなたが望むものではありません。この問題を解決することは、繰り返しファイルの問題の範囲外であるため、単にfor file in path/to/place/*; do stuff_to "$file"; done

おすすめ記事