回答:
どうですか:
ls *[!0-9][0-9].txt
!
グループの先頭には、その意味を補完します。
コメントに記載されているように、これはbashの機能です。たとえば、次のことを試してください。
printf "%s\n" *[!0-9][0-9].txt
ls
)は正規表現をサポートしないことに注意してください。これらはファイル名式(Globbing)です。あなたはすでにあなたの例で違いを見ることができます:ここに*
、ワイルドカードがありますが、これは正規表現にはありません.*
。正規表現は、グロビングよりもはるかに強力です。
質問は正規表現を求めました。Bash、したがってls
、ここでは正規表現をサポートしていません。サポートするのは、ワイルドカードの形式であるファイル名式(Globbing)です。正規表現はそれよりもはるかに強力です。
本当に正規表現を使用したい場合は、次のfind -regex
ように使用できます。
find . -maxdepth 1 -regex '\./.*[^0-9][0-9]\.txt'
Findはデフォルトでは再帰的ですが、そうでls
はありません。現在のディレクトリでのみファイルを検索するには、で再帰を無効にできます-maxdepth 1
。パスを含むファイル名と一致./
するものを検索し.
ます。そのため、でfindを実行した場合、ファイル名はで始まります。正規表現はそれ\./
に対処するために始まります。正規表現で.
は、任意の文字に一致する特殊文字ですが、ここではドットが本当に必要であることに注意してください。そのため、バックスラッシュでエスケープします。.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'
私にとって可能なタイプは、「findutils-default」、「awk」、「egrep」、「ed」、「emacs」、「gnu-awk」、「grep」、「posix-awk」、「posix-basic」です。 、「posix-egrep」、「posix-extended」、「posix-minimal-basic」、「sed」を実行find -regextype help
すると、システムでサポートされているものを確認できます。
kshがグロブ(または拡張して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
、セットdotglob
内のオプションbash
の追加、(D)
グロブで修飾子zsh
、またはセットをFIGNORE
する!(.|..)
中をksh93
。
shopt -s extglob
。