UNIXワイルドカードを使用したファイル範囲のリスト


14

たとえば、作業ディレクトリに次のファイルがあるとします:mjk0001.fits、mjk0002.fits、... mjk9999.fitsまでずっと数値的に増加します。

UNIXワイルドカードを使用して、それらの連続したグループをリストまたは操作する方法はありますか?たとえば、0025から0050でプロセスを実行する必要がある場合、どの形式を使用しますか?

私は以下を試しましたが、成功しませんでした:

ls *[25-50].fits
ls mjk00[25-50].fits
ls mjk[0025-0050]*
ls *[0025-0050]*

みなさん、事前に感謝します


回答:


20

ブレース展開を使用できます。

ls mjk00{25..50}.fits

必要に応じて、先行ゼロを含めることができます。

ls mjk0{000..149}.fits

1
この構文を使用して、ステップ値を指定することもできます{25..50..2}
-nobar

1

直接ではありませんが、複数のグロブパターンを使用できます。

ls mjk002[56789].fits mjk00[34]?.fits

探しているものではありませんが、globパターンが提供する最も近いものであり、各ファイルシステムを入力するよりも確かに優れています。少なくとも数値範囲ごとに必要なパターンの数は、範囲の数値エンドポイントのログによって制限されます。


1

grepで正規表現を使用できます。私は正規表現の第一人者ではありません。次の例では、25〜50の数字のパターンが返されます。

ls | sort -n | grep -E 'mjk00([2][5-9]|[3-4][0-9]|[5][0]).fits'

それが可能かどうか、最終的にgrepでどのように一般化するかはわかりません。


0

forループを使用することにより、移植性または柔軟性を高めることができる場合がありますprintf

for i in $(seq 25 50 1) ; do ls --escape $(printf "mjk%04d*" $i) ||true; done

これはスペースをうまく処理し、結果はxargsさらに処理するための配管に適しています。

複数の一致する番号を指定すると、一致するすべてのファイルがリストされます。

一致しない数値はstderrでエラーを報告しますが、||truebashレベルのエラーリターンは抑制されます。


ただし、基本的なケースでは、forand を使用するprintfことは、より簡潔な場合と同じです。

ls --escape mjk{0025..0050..1}* ||true

あなたはブレース展開の結果を分離したい場合は、forループを使用することができます:for i in {025..050} ; do ... ; done
nobar
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.