Obwohl die Verwendung von findBefehlen 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 extglobmuss mit der folgenden shoptOption festgelegt werden. Die Optionen werden mit der -sUnterstützung aktiviert und mit dem -uFlag deaktiviert . Darüber hinaus können Sie einige weitere Optionen verwenden, z. B. nullglobbei denen ein nicht übereinstimmender Glob vollständig weggefegt und durch einen Satz von Nullwörtern ersetzt wird. Und globstardas 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 *.csvDateien in den rekursiven Pfaden aufzulisten
fileList=(**/*.csv)
Die Option **besteht darin, die Unterordner zu durchsuchen, und *.csvist 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 lsden 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 findBefehl). Stellen Sie sich zum Beispiel vor , Sie müssten alle rekursiven Bilddateien abrufen, dh Erweiterungen *.gif, *.pngund *.jpgalles, 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 bashShells ausgeführt werden, ist diese Option nicht richtig.