Obwohl die Verwendung von find
Befehlen hier nützlich sein kann, bietet die Shell selbst Optionen, um diese Anforderung ohne Tools von Drittanbietern zu erfüllen. Dasbash
Shell bietet eine erweiterte Glob-Unterstützungsoption, mit der Sie die Dateinamen unter rekursiven Pfaden abrufen können, die mit den gewünschten Erweiterungen übereinstimmen.
Die erweiterte Option extglob
muss mit der folgenden shopt
Option festgelegt werden. Die Optionen werden mit der -s
Unterstützung aktiviert und mit dem -u
Flag deaktiviert . Darüber hinaus können Sie einige weitere Optionen verwenden, z. B. nullglob
bei denen ein nicht übereinstimmender Glob vollständig weggefegt und durch einen Satz von Nullwörtern ersetzt wird. Und globstar
das ermöglicht es, alle Verzeichnisse zu durchsuchen
shopt -s extglob nullglob globstar
Jetzt müssen Sie nur noch den Glob-Ausdruck bilden, um die Dateien einer bestimmten Erweiterung einzuschließen. Dies können Sie wie folgt tun. Wir verwenden ein Array, um die Glob-Ergebnisse zu füllen, da die Dateinamen mit Sonderzeichen intakt bleiben und nicht durch Wortaufteilung durch die Shell beschädigt werden, wenn sie richtig zitiert und erweitert werden.
Zum Beispiel, um alle *.csv
Dateien in den rekursiven Pfaden aufzulisten
fileList=(**/*.csv)
Die Option **
besteht darin, die Unterordner zu durchsuchen, und *.csv
ist eine globale Erweiterung, um alle Dateien der genannten Erweiterungen einzuschließen . Jetzt zum Drucken der eigentlichen Dateien einfach tun
printf '%s\n' "${fileList[@]}"
Die Verwendung eines Arrays und eine ordnungsgemäße Erweiterung in Anführungszeichen ist der richtige Weg, wenn Sie in Shell-Skripten verwendet werden. Für die interaktive Verwendung können Sie jedoch einfach ls
den glob-Ausdruck als verwenden
ls -1 -- **/*.csv
Dies könnte sehr gut erweitert werden, um mehrere Dateien abzugleichen, dh Dateien, die mit mehreren Erweiterungen enden (dh ähnlich dem Hinzufügen mehrerer Flags im find
Befehl). Stellen Sie sich zum Beispiel vor , Sie müssten alle rekursiven Bilddateien abrufen, dh Erweiterungen *.gif
, *.png
und *.jpg
alles, was Sie brauchen, ist
ls -1 -- **/+(*.jpg|*.gif|*.png)
Dies könnte sehr gut erweitert werden, um auch negative Ergebnisse zu erzielen. Mit der gleichen Syntax könnte man die Ergebnisse des Glob verwenden, um Dateien eines bestimmten Typs auszuschließen. Angenommen, Sie möchten Dateinamen mit den oben genannten Erweiterungen ausschließen
excludeResults=()
excludeResults=(**/!(*.jpg|*.gif|*.png))
printf '%s\n' "${excludeResults[@]}"
Das Konstrukt !()
ist eine Negationsoperation, bei der keine der darin aufgeführten Dateierweiterungen enthalten ist, und es |
handelt sich um einen Wechseloperator, wie er in der Bibliothek für erweiterte reguläre Ausdrücke verwendet wird, um eine ODER-Übereinstimmung der Globs durchzuführen.
Beachten Sie, dass diese erweiterte Glob-Unterstützung in der POSIX-Bourne-Shell nicht verfügbar ist und nur für neuere Versionen von spezifisch ist bash
. Wenn Sie also die Portabilität der Skripte in Betracht ziehen, die unter POSIX und bash
Shells ausgeführt werden, ist diese Option nicht richtig.