Wie kann ich Dateien mit einem Dateinamen auflisten, der mit dem letzten Zeichen und mit endet? .txt
Erweiterung ?
Ich habe es versucht, ls *+([[:digit:]]).txt
aber das ist wahr fürabc12.txt
und abc2.txt
.
Aber ich muss nur bekommen abc2.txt
. Wie kann ich das machen?
Gibt es irgendeine Art von Form :digit:
, die dies bewirkt?
shopt -s extglob
.Antworten:
Wie wäre es mit:
Das
!
am Anfang der Gruppe ergänzt ihre Bedeutung.Wie in den Kommentaren vermerkt, ist dies Bashs Aufgabe, versuchen Sie zB:
quelle
ls
) hier keine regulären Ausdrücke unterstützt. Dies sind Dateinamenausdrücke (Globbing) . Sie sehen den Unterschied bereits in Ihrem Beispiel: Hier*
ist ein Platzhalter, der in regulären Ausdrücken nicht vorhanden ist, mit dem Sie.*
dasselbe erreichen würden . Reguläre Ausdrücke sind viel leistungsfähiger als Globbing.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 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ürdeAtxt
. 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
unterstützt ein paar verschiedene Regex-Geschmacksrichtungen. Sie können beispielsweise Folgendes angeben-regextype
: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.quelle
Mit den erweiterten ksh-Globs (oder
bash -O extglob
oderzsh -o kshglob
), die Sie bereits verwenden, wäre das:Oder
Wenn du weiter passen willst
a1.txt
und2.txt
doch nichta12.txt
noch12.txt
.Beachten Sie jedoch, dass in ksh und bash (sofern Sie nicht die
failglob
Option zum Abrufen eines ähnlichen Verhaltens wie zsh festlegen ) das Muster wörtlich an übergebenls
wird , wenn dieses Muster keiner Datei entspricht , und wenn diese (seltsam benannte) Datei passiert vorhanden ist, wird es aufgelistetls
, obwohl es nicht mit dem Muster selbst übereinstimmt.Um dies einzuschließen
.2.txt
, setzen Sie diedotglob
Option inbash
, fügen Sie das(D)
Glob-Qualifikationsmerkmal in hinzuzsh
oder setzen SieFIGNORE
auf!(.|..)
inksh93
.quelle