Ich würde gerne so etwas schreiben:
$ ls **.py
Um alle .py-Dateinamen abzurufen, durchlaufen Sie rekursiv eine Verzeichnishierarchie.
Auch wenn .py-Dateien zu finden sind, gibt die Shell (Bash) Folgendes aus:
ls: cannot access **.py: No such file or directory
Wie kann ich tun, was ich will?
EDIT: Ich möchte angeben, dass ich nicht an dem konkreten Fall von interessiert bin ls
, aber die Frage ist über die Glob-Syntax.
nullglob
nullglob
ich es aktiviere , würde ich dringend empfehlen, folgende Warnungen zu lesen .wc -l {**,.}/*.py
einwandfrei** macht nur einen einzigen *, beide arbeiten im aktuellen Verzeichnis
quelle
find
wenn Sie nicht Bash 4 haben. Beispiele:yourcommand `find . -name '*.py'`
(Beachten Sie die Backticks);find . -name '*.py' -exec yourcommand {} \;
.Seit Bash 4 (einschließlich zsh) wurde eine neue Globbing-Option (
globstar
) hinzugefügt, die das Muster**
anders behandelt, wenn es gesetzt ist.Es stimmt mit dem Platzhaltermuster überein und gibt die übereinstimmenden Datei- und Verzeichnisnamen zurück, indem das Platzhaltermuster im Befehl durch die übereinstimmenden Elemente ersetzt wird.
Normalerweise
**
funktioniert es bei der Verwendung ähnlich*
, aber es rekursiv alle Verzeichnisse (wie eine Schleife).Um festzustellen, ob es aktiviert ist, überprüfen Sie es mit
shopt globstar
(in Skripten verwenden Sieshopt -q globstar
).Das Beispiel
**.py
würde nur für das aktuelle Verzeichnis funktionieren, da es keine Liste der Verzeichnisse zurückgibt, die rekursiv sein können. Aus diesem Grund müssen Sie Platzhalter auf mehreren Verzeichnisebenen verwenden**/*.py
, damit es tiefer geht.Bitte finden auf SO wenige Syntax Tests , die ich habe für rekursiv alle Dateien zu finden.
quelle