私は数日間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
。