「ls」と正規表現を使用してリスト

「ls」と正規表現を使用してリスト

ファイル名が最後の文字で終わり、拡張子を持つ.txtファイルを一覧表示するには?

私はこれを試しましたが、ls *+([[:digit:]]).txtこれはabc12.txt両方とも正しいですabc2.txt

abc2.txtしかし、私はちょうど。

:digit:これを行うためのフォームがありますか?

答え1

どうですか?

ls -d -- *[!0-9][0-9].txt

!グループの始まりはその意味を補完します。

コメントで指摘したように、これはbashが行うことです。たとえば、次のようになります。

printf "%s\n" *[!0-9][0-9].txt

答え2

質問は正規表現を要求します。 Bashはls正規表現をサポートしないため、正規表現をサポートしません。サポートするものファイル名表現ワイルドカード)、ワイルドカードの一形態です。正規表現はこれよりはるかに強力です。

本当に正規表現を使用したい場合は、find -regex次のようにできます。

find . -maxdepth 1 -regex '\./.*[^0-9][0-9]\.txt'

デフォルトでは、ルックアップは再帰的ですが、lsそうではありません。現在のディレクトリにあるファイルのみを検索するには、-maxdepth 1.を使用してパスのファイル名と一致するエントリを見つけることができます。したがって、./find in を実行すると、ファイル名が..\./当初、この問題を解決するために正規表現が作成されました。正規表現では、.特殊文字はすべての文字と一致しますが、ここではドットが必要なので、バックスラッシュでエスケープします。.txt正規表現も一致するので、点に対しても同じことを行いますAtxt。数値カテゴリは、文字カテゴリを反転させるのではなく、文字カテゴリを^逆にする必要があることを除いて、ワイルドカードと同じです。!

出力を取得するには、次のように使用lsできます。-exec ls

 find . -maxdepth 1 -regex '\./.*[^0-9][0-9]\.txt' -exec ls -lah {} \;

findいくつかの正規表現スタイルがサポートされています。たとえば、次のように指定できます-regextype

find . -maxdepth 1 -regextype egrep -regex '\./.*[^0-9][0-9]\.txt'

私にとって可能なタイプは次のとおりです。 basic ' , 'posix-egrep' , 'posix-extended' , 'posix-minimal-basic' , 'sed' 実行して、find -regextype helpシステムがサポートする機能を確認できます。

答え3

すでに使用している ksh 拡張 glob( または ) を使用すると、bash -O extglob次のようになります。zsh -o kshglob

ls -d -- ?(*[![:digit:]])[[:digit:]].txt

または

ls -d -- !(*[[:digit:]])[[:digit:]].txt

似合いたい場合a1.txt そして2.txtしかしa12.txtいいえ、いいえ12.txt

ただし、kshとbashで(failglobzshに似た動作を得るためのオプションを設定しない限り)、パターンがどのファイルとも一致しないls場合、パターンは文字通り渡され(奇妙な名前の)ファイルが存在する場合、lsパターン自体と一致します。しなくても一覧表示されます。

を含めるには でオプションを.2.txt設定するか、 で glob 修飾子を追加するか、 に設定します。dotglobbash(D)zshFIGNORE!(.|..)ksh93

関連情報