Chociaż użycie findpolecenia może być przydatne tutaj, sama powłoka zapewnia opcje umożliwiające spełnienie tego wymagania bez narzędzi innych firm. bashPowłoka zapewnia rozszerzoną opcję pomocy glob za pomocą którego można uzyskać nazwy plików pod rekurencyjnych ścieżek że mecz z rozszerzeniami, które chcesz.
Rozszerzona opcja jest tym, extglobco należy ustawić za pomocą shoptopcji przedstawionej poniżej. Opcje są włączone z -sobsługą i wyłączone z -uflagą on . Dodatkowo możesz użyć kilku opcji więcej, tj. nullglobW którym niezrównany glob zostaje całkowicie zmieciony, zastąpiony zestawem zerowych słów. I globstarktóry pozwala na przeszukanie przez wszystkich katalogów
shopt -s extglob nullglob globstar
Teraz wystarczy utworzyć wyrażenie glob, aby uwzględnić pliki określonego rozszerzenia, które można wykonać w sposób opisany poniżej. Używamy tablicy do wypełniania wyników globalnych, ponieważ przy prawidłowym cytowaniu i rozwinięciu nazwy plików ze znakami specjalnymi pozostałyby nienaruszone i nie uległyby uszkodzeniu z powodu podziału słów przez powłokę.
Na przykład, aby wyświetlić listę wszystkich *.csvplików w ścieżkach rekurencyjnych
fileList=(**/*.csv)
Opcja **polega na ponownym przechodzeniu przez podfoldery i *.csvjest rozszerzeniem globalnym w celu włączenia dowolnego pliku wymienionych rozszerzeń. Teraz do drukowania rzeczywistych plików, po prostu zrób
printf '%s\n' "${fileList[@]}"
Używanie tablicy i poprawne cytowanie rozszerzenia jest właściwym sposobem, gdy jest używane w skryptach powłoki, ale do użytku interaktywnego można po prostu użyć lswyrażenia glob jako
ls -1 -- **/*.csv
Można to bardzo dobrze rozszerzyć, aby pasowało do wielu plików, tj. Plik kończący się wieloma rozszerzeniami (tj. Podobnie jak dodawanie wielu flag w findpoleceniu). Dla przykładu rozważmy przypadek konieczności, aby wszystkie pliki graficzne rekurencyjnych czyli rozszerzeń *.gif, *.pnga *.jpgwszystko, czego potrzebujesz do Is
ls -1 -- **/+(*.jpg|*.gif|*.png)
Można to bardzo dobrze rozszerzyć, aby również miało negatywne wyniki. Przy tej samej składni można użyć wyników globu, aby wykluczyć pliki określonego typu. Załóżmy, że chcesz wykluczyć nazwy plików z powyższymi rozszerzeniami, możesz to zrobić
excludeResults=()
excludeResults=(**/!(*.jpg|*.gif|*.png))
printf '%s\n' "${excludeResults[@]}"
Konstrukt !()jest operacją negowania, która nie obejmuje żadnego z rozszerzeń plików wymienionych w środku, i |jest operatorem naprzemiennym, tak jak jest używany w bibliotece Rozszerzonych wyrażeń regularnych, aby wykonać dopasowanie LUB globów.
Zauważ, że ta rozszerzona obsługa globów nie jest dostępna w powłoce bourne POSIX i jest ona specyficzna dla ostatnich wersji bash. Więc jeśli zastanawiasz się nad przenośnością skryptów działających w POSIX i bashpowłokach, ta opcja nie byłaby właściwa.