forループグロブ事故


10

私は、一連のディレクトリをループするスクリプトを設定しようとしています。.jpgファイルが見つかると1つ、.nefファイルが見つかると別のことを行います。たとえば、ディレクトリに.jpgファイル(または.nef)がない場合、グロブエントリは拡張されたグロブではなく、単なる文字列です。例えば:

my_dir="pictures/"
ext="JPG"
for f in "$my_dir"*."$ext"; do
    echo $f
done

my_dirフォルダーに.JPGファイルが含まれている場合、それらはコマンドラインに正しくエコーされます。

pictures/one.JPG
pictures/two.JPG

ただし、my_dirに.JPGファイルがない場合は、ループが1回繰り返されてエコーします。

pictures/*.JPG

グロブが一致しない場合にforループに入らないようにするには、これをどのように構築しますか?

回答:


17

これは通常のデフォルトの動作です。グロビングがどのファイル/ディレクトリにも一致しない場合、元のグロビング文字が保持されます。

代わりに空の結果を取得したい場合はnullglob、次のようにスクリプトでオプションを設定できます。

$ shopt -s nullglob
$ for f in "$my_dir"*."$ext"; do echo $f; done
$

後でそれを無効にすることができます:

$ shopt -u nullglob

6

findファイルに対して実行しているコマンドが1行にドロップするほど単純な場合、ここを使用して少し横にステップすることもここで役立つかもしれません。Findはいくつかのパスをたどって調べることができ、サブディレクトリ内のファイルも喜んで見つけます。

$ find foo/ bar/ -name "*.jpg" -exec echo {} \;
foo/ccc.jpg
foo/bbb.jpg
bar/aaa.jpg

(実行されるコマンドは、-execフラグの後に指定され、;。で終了し{}、現在のファイルの名前に置き換えられます。)


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.