ファイル名が最後の文字で終わり、拡張子を持つ.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で(failglob
zshに似た動作を得るためのオプションを設定しない限り)、パターンがどのファイルとも一致しないls
場合、パターンは文字通り渡され(奇妙な名前の)ファイルが存在する場合、ls
パターン自体と一致します。しなくても一覧表示されます。
を含めるには でオプションを.2.txt
設定するか、 で glob 修飾子を追加するか、 に設定します。dotglob
bash
(D)
zsh
FIGNORE
!(.|..)
ksh93