私はディレクトリにいて、中に.jpg画像を含むpicturesという別のディレクトリがあり、その中に「./operation image1.jpg」という操作を実行したいとします。ディレクトリ内のファイルを繰り返し検索すると、必要な出力が得られませんでした。
#!/bin/sh
cd pictures
pictures=$ls
for pic in $pictures
do
./operation $pic
done
それが私が持っているコードです。私は何を間違っていますか?
lsファイル名内のスペースではうまく機能しないため、ファイルのリストを取得するために使用しないでください。次のようになります。
my file.jpg
another file.jpg
の中へ:
my
file.jpg
another
file.jpg
フィルbashリストを処理させれば、その問題に遭遇することはありません。各ファイルを引用符で囲むことを忘れないでください。これにより、スペースが含まれているファイル全体が保持されます。
#!/bin/sh
cd pictures
for pic in *.jpg ; do
./operation "$pic"
done
また
find pictures/ -type f -name '*.jpg' -exec \./operation {} \;
ファイル名のスペースが問題を引き起こすという事実は別として、スクリプトは機能しますが、pictures=$ls の割り当ては正しくありません。pictures=$(ls) である必要があります... 変数内の空白を考慮する必要がある場合は、二重引用符で囲んでください: "$var" ... また、ファイル名のソースとして ls を使用しないでください。他の方法では回避できない多くの問題があります。たとえば、paxdiablo の回答に示されているように、find または shell 拡張を使用します。
find実際に何をリストするか、さらにはそれをどのように処理するかを細かく制御できます。
これを行うには、さらにいくつかの方法があります。
# using find
find -maxdepth 1 -type f -name '*.jpg' -exec ./operation "{}" \;
# using an array
pic=(*.jpg)
for p in "${pic[@]}" ;do
./operation "$p"
done
# You can (with care) even use ls ... but why would you?
# I've just added it here to show the use of IFS (Input Field Seperator)
IFS=$'\n' # this makes `\n` the only delimiter.
pic=$(ls -1 *.jpg )
for p in $pic ;do
./operation "$p"
done