たとえば、作業ディレクトリに以下のファイルがあるとします。
UNIXワイルドカードを使用して、それらの順次グループをリストまたは操作する方法はありますか?たとえば、0025から0050までのプロセスを実行する必要がある場合、どのフォーマットを使用しますか?
私は以下を試しましたが、成功しませんでした:
ls *[25-50].fits
ls mjk00[25-50].fits
ls mjk[0025-0050]*
ls *[0025-0050]*
みなさん、ありがとうございました、MK
ブレース展開を使用できます。
ls mjk00{25..50}.fits
必要に応じて、先行ゼロを含めることができます。
ls mjk0{000..149}.fits
直接ではありませんが、複数のグロブパターンを使用できます。
ls mjk002[56789].fits mjk00[34]?.fits
それはあなたが探しているものではありませんが、グロブパターンが提供する最も近いものであり、各ファイルシステムを入力するよりも確かに優れています。少なくとも数値範囲ごとに必要となるパターンの数は、範囲の数値エンドポイントの対数によって制限されます。
Grepで正規表現を使用できます。私は正規表現の第一人者ではありません。次の例では、25から50までの数字でパターンを返します。
ls | sort -n | grep -E 'mjk00([2][5-9]|[3-4][0-9]|[5][0]).fits'
それが可能かどうか、そして最終的にこれをgrepで一般化する方法はわかりません。
for
ループとprintf
を使用すると、移植性や柔軟性を向上させることができる場合があります。
for i in $(seq 25 50 1) ; do ls --escape $(printf "mjk%04d*" $i) ||true; done
これはスペースを適切に処理し、結果はxargs
へのパイピングにさらに適しています。
複数の一致がある番号では、一致するすべてのファイルがリストされます。
一致しない数値はstderrでエラーを報告しますが、||true
bashレベルのエラーが返されないようにします。
ただし、基本的なケースでは、for
とprintf
を使用することは、より簡潔であることに変わりはありません。
ls --escape mjk{0025..0050..1}* ||true