Die Frage wurde nach regulären Ausdrücken gestellt. Bash ls
unterstützt hier also keine regulären Ausdrücke. Was es unterstützt, sind Dateinamenausdrücke ( Globbing ), eine Form von Platzhaltern. Reguläre Ausdrücke sind viel leistungsfähiger.
Wenn Sie wirklich reguläre Ausdrücke verwenden möchten, können Sie folgendermaßen vorgehen find -regex
:
find . -maxdepth 1 -regex '\./.*[^0-9][0-9]\.txt'
Find ist standardmäßig rekursiv, aber ls
nicht. Um nur Dateien im aktuellen Verzeichnis zu finden, können Sie die Rekursion mit deaktivieren -maxdepth 1
. Finden Sie Übereinstimmungen mit dem Dateinamen mit Pfad. Deshalb beginnen die Dateinamen mit, ./
wenn Sie find in ausführen .
. Der Regex beginnt damit umzugehen \./
. Beachten Sie, dass es sich bei einem regulären Ausdruck .
um ein Sonderzeichen handelt, das mit jedem Zeichen übereinstimmt. Hier wollen wir jedoch unbedingt einen Punkt. Deshalb schließen wir ihn mit einem Backslash. Wir machen dasselbe für den Punkt in .txt
, da der reguläre Ausdruck sonst auch übereinstimmen würde Atxt
. Die Ziffernklassen sind die gleichen wie beim Globbing, nur dass Sie ^
stattdessen brauchen!
zu invertieren der Zeichenklasse.
Wenn Sie die Ausgabe von erhalten möchten, ls
können Sie -exec ls
wie folgt verwenden:
find . -maxdepth 1 -regex '\./.*[^0-9][0-9]\.txt' -exec ls -lah {} \;
find
unterstützt ein paar verschiedene Regex-Geschmacksrichtungen. Sie können beispielsweise Folgendes angeben -regextype
:
find . -maxdepth 1 -regextype egrep -regex '\./.*[^0-9][0-9]\.txt'
Mögliche Typen sind für mich: 'findutils-default', 'awk', 'egrep', 'ed', 'emacs', 'gnu-awk', 'grep', 'posix-awk', 'posix-basic' , 'posix-egrep', 'posix-extended', 'posix-minimal-basic', 'sed' Sie können find -regextype help
herausfinden, was auf Ihrem System unterstützt wird.
shopt -s extglob
.