1

私はディレクトリにいて、中に.jpg画像を含むpicturesという別のディレクトリがあり、その中に「./operation image1.jpg」という操作を実行したいとします。ディレクトリ内のファイルを繰り返し検索すると、必要な出力が得られませんでした。

#!/bin/sh

cd pictures
pictures=$ls

for pic in $pictures
do
   ./operation $pic
done

それが私が持っているコードです。私は何を間違っていますか?

4

3 に答える 3

3

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
于 2012-04-07T05:09:24.900 に答える
1

また

find pictures/ -type f -name '*.jpg' -exec \./operation {} \;
于 2012-04-07T06:02:13.033 に答える
1

ファイル名のスペースが問題を引き起こすという事実は別として、スクリプトは機能しますが、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
于 2012-04-07T06:25:52.497 に答える