Führen Sie `ls` rekursiv mit Platzhaltern aus

Führen Sie `ls` rekursiv mit Platzhaltern aus

Ich versuche, alle Projektdateien eines bestimmten Dateityps zu finden mit:

ls -ltR *.mb

Ich weiß, dass die gewünschten Dateien in mehreren Ordnern vorhanden sind, bekomme aber keine Ergebnisse zurück. Was habe ich falsch gemacht?

Antwort1

lsstimmt nicht mit Mustern überein. Es listet einfach die Dateien oder Ordner in den Eingabeargumenten auf. *.mbwird von der Shell erweitertVorÜbergabe an , daher wird nichts ausgegeben, lswenn im aktuellen Verzeichnis keine Dateien mit diesem Namen vorhanden sind , andernfalls werden nur die Dateien im aktuellen Verzeichnis ausgegeben*.mb

Die Standardmethode zum rekursiven Auflisten von Dateien ist die Verwendung vonfind

find . -name '*.mb' -type f -printf "%-.22T+ %M %n %-8u %-8g %8s %Tx %.8TX %p\n" | sort | cut -f 2- -d ' '

Auf diese Weise können Sie das Ausgabelistenformat nach Ihren Wünschen anpassen. Siehe:Dateien nach letztem Bearbeitungsdatum auflisten


Eine alternative Möglichkeit ist die VerwendungglobstarDies kann aktiviert werden mitshopt -s globstar

ls -ltR **/*.mb

Die erste Option **/passt zu beliebigen Unterverzeichnispfaden. Dann *.mbpasst sie Ihre Dateien in diesen Verzeichnissen an

  • Weltstar

    **Wenn festgelegt, stimmt das im Kontext einer Dateinamenerweiterung verwendete Muster mit allen Dateien und null oder mehr Verzeichnissen und Unterverzeichnissen überein. Wenn auf das Muster ein folgt /, stimmen nur Verzeichnisse und Unterverzeichnisse überein.

https://www.gnu.org/software/bash/manual/html_node/The-Shopt-Builtin.html

Antwort2

@phuclv bietet zwei gute Optionen. Wenn ich etwas Ähnliches tun muss, leite ich die Ausgabe von ls normalerweise wie folgt an grep weiter:

ls -ltR | grep .*\.mb

Dadurch wird die Ausgabe von ls an die Eingabe von grep gesendet, anstatt sie an stdout auszugeben, und grep gibt dann nur die Zeilen aus, die mindestens eine Übereinstimmung für den regulären Ausdruck enthalten.

Der reguläre Ausdruck

.*\.mb

kann wie folgt erklärt werden:

.: match any character
*: preceding character or group should appear 0 or more times
\.mb: literally .mb

verwandte Informationen