globパターンを展開する最良の方法は?


29

私はグロブパターン(のように展開する必要がある../smth*/*、または/etc/cron*/プログラムによって、ファイルのリストに)を。それを行う最善の方法は何でしょうか?


2
特別なことをする必要はありません*
ケビン

1
ただし、解析しようとする場合は、答えが示すような配列を使用してください。
ケビン

回答:


40

配列宣言の右側に展開するだけです:

list=(../smth*/)          # grab the list
echo "${#list[@]}"        # print array length
echo "${list[@]}"         # print array elements
for file in "${list[@]}"; do echo "$file"; done  # loop over the array


シェルオプションnullglobを設定する必要があることに注意してください。
デフォルトでは設定されていません。
グロブ(または複数のグロブの1つ)がどの名前とも一致しない場合のエラーを防ぎます。

それを設定するbash

shopt -s nullglob

または中zsh

setopt nullglob

そして、そのリストを後で印刷するにはどうすればよいですか?
Rogach

単なる通常の配列です。任意の配列でできることは何でもできます。いくつかの例を追加しました。
マナトワーク

1
問題があります。パターンがファイルに一致しない場合、それ自体を印刷します-これはあまり良くありません。
ロガック

5
ああ、shopt -s nullglobはそれを解決します。
Rogach

1
@lindhe、unsetoptおよびに使用したのと同じパラメーターsetopt
マナトワーク

0

物事を過度に複雑にする必要はありません。

echo your/stuff*

これは機能しません。たとえば、次のTEST=$(echo your/stuff*) && eval \"$TEST\"意志出力:your/stuff*: No such file or directory
セバスチャン

@Sebastianこれはnullglobの問題です。上記を参照してください
Alexei Averchenko

1
いいえ、それはnullglobの問題ではありません。エスケープ文字を使用することは、展開されていないTEST文字列として変数を評価しています*
セバスチャン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.