web-dev-qa-db-ja.com

grepでファイルを一覧表示しますか?

次のファイルを含むディレクトリがあります。

file1a file1ab file12A2 file1Ab file1ab

file1で始まり、その後に最大2文字が続くすべてのファイルをリストしたい!

私が提案した解決策は次のとおりです。

ls | grep -i file1 [az] {2}

しかし、それは機能しません!

なぜ知りたいですか?そしてリストする方法?

7
Mahmoud Assyass

grepまたはlsのパイピングは必要ありません。シェルグロビングを使用します。

bashでは、extglobパターンを使用します(最初に設定するためにshopt -s extglobを実行しない場合は、対話型セッションでデフォルトで有効にする必要があります):

file1@(|?|??)

?は任意の1文字と一致し、@(||)|で区切られたパターンのいずれかを選択します。

a-zA-Zの間の任意の文字のみを一致させる場合は、現在のロケールのすべてのアルファベット文字を示す文字クラス[:alpha:]を使用します。

file1@(|[[:alpha:]]|[[:alpha:]][[:alpha:]])

例:

$ ls -1
file1
file112
file11a
file12A2
file1a
file1ab
file1Ab
file1as
file2
fileadb

$ ls -1 file1@(|[[:alpha:]]|[[:alpha:]][[:alpha:]]))
file1
file1a
file1ab
file1Ab
file1as

zshはこれをネイティブにサポートします:

file1(|[[:alpha:]]|[[:alpha:]][[:alpha:]])

OPからの要求に応じて、この部分に非常にしぶしぶ答えています。

将来の読者は、lsを解析せず、グロビングを使用してください。

lsおよびgrepの使用:

ls | grep -E '^file1[[:alpha:]]{,2}$'

例:

% ls | grep -E '^file1[[:alpha:]]{,2}$'
file1
file1a
file1ab
file1Ab
file1as
11
heemayl

検索はどうですか?

find . -maxdepth 1 -regextype posix-egrep -iregex '\./file1[a-z]{,2}.*'
3
A.B.

find with -regexフラグは、この種のジョブにより適しています。特に、 lsの出力を解析しないでください という一般的なルールがあるためです。

ただし、ファイルを検索するのは1つのディレクトリのみで(サブディレクトリに降りていない)、具体的にはlsgrepが必要だと述べています。解決策は

\ls | grep -E 'file1[a-z]{2,}' 

また、現在のディレクトリで検索していることを考慮しますが、lsの解析は避けます。これは別の解決策です

 for file in * ; do echo "$file" | grep -E 'file1[a-z]{2,}' ;done                                        
./file1ab
./file1abc

現在のディレクトリには、file1abfile1abcの2つのファイルがあります。どちらの場合も、結果は次のとおりです。

xieerqi:$ for file in * ; do echo "$file" | grep -E 'file1[a-z]{2,}' ;done                                        
./file1ab
./file1abc

xieerqi:$ \ls | grep -E 'file1[a-z]{2,}'                                                                            
file1ab
file1abc
3