web-dev-qa-db-ja.com

UNIXワイルドカードを使用してファイル範囲をリストする

たとえば、作業ディレクトリに以下のファイルがあるとします。

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

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

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

みなさん、ありがとうございました、MK

15
Matt Keene

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

ls mjk00{25..50}.fits

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

ls mjk0{000..149}.fits
22
chepner

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

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

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

1
Celada

Grepで正規表現を使用できます。私は正規表現の第一人者ではありません。次の例では、25から50までの数字でパターンを返します。

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

それが可能かどうか、そして最終的にこれをgrepで一般化する方法はわかりません。

1
Heisenbug

forループとprintfを使用すると、移植性や柔軟性を向上させることができる場合があります。

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

これはスペースを適切に処理し、結果はxargsへのパイピングにさらに適しています。

複数の一致がある番号では、一致するすべてのファイルがリストされます。

一致しない数値はstderrでエラーを報告しますが、||true bashレベルのエラーが返されないようにします。


ただし、基本的なケースでは、forprintfを使用することは、より簡潔であることに変わりはありません。

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