次のファイルを含むディレクトリがあります。
file1a file1ab file12A2 file1Ab file1ab
file1
で始まり、その後に最大2文字が続くすべてのファイルをリストしたい!
私が提案した解決策は次のとおりです。
ls | grep -i file1 [az] {2}
しかし、それは機能しません!
なぜ知りたいですか?そしてリストする方法?
grep
またはls
のパイピングは必要ありません。シェルグロビングを使用します。
bash
では、extglob
パターンを使用します(最初に設定するためにshopt -s extglob
を実行しない場合は、対話型セッションでデフォルトで有効にする必要があります):
file1@(|?|??)
?
は任意の1文字と一致し、@(||)
は|
で区切られたパターンのいずれかを選択します。
a-z
とA-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
検索はどうですか?
find . -maxdepth 1 -regextype posix-egrep -iregex '\./file1[a-z]{,2}.*'
find
with -regex
フラグは、この種のジョブにより適しています。特に、 lsの出力を解析しないでください という一般的なルールがあるためです。
ただし、ファイルを検索するのは1つのディレクトリのみで(サブディレクトリに降りていない)、具体的にはls
とgrep
が必要だと述べています。解決策は
\ls | grep -E 'file1[a-z]{2,}'
また、現在のディレクトリで検索していることを考慮しますが、ls
の解析は避けます。これは別の解決策です
for file in * ; do echo "$file" | grep -E 'file1[a-z]{2,}' ;done
./file1ab
./file1abc
現在のディレクトリには、file1ab
とfile1abc
の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