2017-07-29 11 views
0

私は、次のファイルとディレクトリを持っている:「ls」のbashでコマンド - マッチングnumericals

root.o 
root.type1 
root.type2 
root.type1.c 
root.type2.c 
root.type1.c.pa0 
root.type2.c.pa0 
root.type2.c.pa1 
root.type2.c.pa2 
root.type2.c.pa3 
.... 
root.type2.c.pa100 
root.type2.c.pa0.out 
root.type2.c.pa1.out 
root.type2.c.pa2.out 
root.type2.c.pa3.out 
... 
root.type2.c.pa100.out 

私は.outで終わるファイルを除外し、root.type2.c.pa.で始まり、数字で終わるファイルをリストしたいと思います。

root.type2.c.pa0 
root.type2.c.pa1 
root.type2.c.pa2 
root.type2.c.pa3 
.... 
root.type2.c.pa100 

ライティングls root.type2.c.pa?ls root.type2.c.pa??、およびls root.type2.c.pa???は仕事をするでしょう。つまり、私はこのチャンクを一覧表示します。

目的のファイルの最後にいくつの番号があるのか​​わからなくてもチャンクをリストする簡単な方法はありますか?上記の例では、最大で3つの数字があります。実際には、1,2,3,4、または5の数字があるかもしれません。

答えて

4
shopt -s extglob 
ls root.type2.c.pa+([0-9]) 
+0

https://www.gnu.org/software/bash/manual/html_node/The-Shopt-Builtin.html – Anubis

0

使用のgrepと正規表現:

ls |grep -P "root.type2.c.pa[0-9]+$" 
+0

これもblah.root.type2.c.pa01'や休憩のための 'のようなファイルにマッチ名前に改行を含むファイル。 –

0

これを試してみてください:

ls -1 | grep -oP "root.type2.c.pa\d{1,}" 
+0

これは 'something.root.type2.c.pa01'ファイルにもマッチします。' ls'をパイプしている場合は '-1'は必要ありませんし、' ls'の出力を解析してはいけません。 –

0

コマンドラインシェルのワイルドカード(*?[...])、ファイル名のリストが含まれていますlsで指定されていません。シェルはワイルドカードを展開し、一致するファイル名のリストをlsに渡します。 lsは、他の詳細(サイズ、所有者、許可、日付など)の有無にかかわらずファイル名のみを表示します。

可能な解決策はgrepにパイプすべての必要なファイル(およびおそらく他のファイル)が含まlsのコマンドラインを構成する出力をワイルドカードを使用してのみ、所望のファイルをフィルタリングするためにそれを使用することである。

ls -1 root.type2.c.pa* | grep '^root\.type2\.c\.pa\d\+$' 
- ;リストの名前 root.type2.c.paで始まるすべてのファイル

  • ls -1 root.type2.c.pa*を:どのように動作

    -1は、それぞれのファイル名を別々の行に表示するようにlsに指示します。

  • grep '^root\.type2\.c\.pa\d\+$'lsの出力をフィルタリングし、少なくとも1桁(\d\+)と何もない($が行末である)に続いてroot.type2.c.paで始まる名前だけを保持します。
関連する問題