9

この単純なループを考えてみましょう:

for f in *.{text,txt}; do echo $f; done

有効なファイル名のみをエコーし​​たい。スクリプトで $f 変数を使用すると、その拡張子のファイルがない限り、すべてうまく機能します。空のセットの場合、$f は *.text に設定され、上記の行がエコーされます。

*.text
*.txt

何もエコーしないのではなく。これは、実際の実際のファイル名を期待するものに $f を使用しようとして、代わりに *.

空のセットにならないようにワイルドカードに一致するファイルがある場合、すべてが希望どおりに機能します。例えば

123.text
456.txt
789.txt

エラーなしで、アスタリスクの $f に一致する最初の文字列の一見過度の複雑さなしに、どうすればこれを行うことができますか?

4

3 に答える 3

15

オプションを設定しnullglobます。

$ for f in *.foo ; do echo "$f" ; done
*.foo
$ shopt -s nullglob
$ for f in *.foo ; do echo "$f" ; done
$ 
于 2012-09-07T14:59:47.797 に答える
4

ファイルが実際に存在するかどうかをテストできます。

for f in *.{text,txt}; do if [ -f $f ]; then echo $f; fi; done

findまたは、次のコマンドを使用できます。

for f in $(find -name '*.text' -o -name '*.txt'); do
  echo $f
done
于 2012-09-07T14:56:42.840 に答える
0

また、 を外部で使用する余裕がある場合はls、 を使用してその結果を回避できます。

for f in `ls *.txt *.text`;
于 2012-09-07T14:58:09.607 に答える