Chociaż użycie find
polecenia może być przydatne tutaj, sama powłoka zapewnia opcje umożliwiające spełnienie tego wymagania bez narzędzi innych firm. bash
Powł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, extglob
co należy ustawić za pomocą shopt
opcji przedstawionej poniżej. Opcje są włączone z -s
obsługą i wyłączone z -u
flagą on . Dodatkowo możesz użyć kilku opcji więcej, tj. nullglob
W którym niezrównany glob zostaje całkowicie zmieciony, zastąpiony zestawem zerowych słów. I globstar
któ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 *.csv
plików w ścieżkach rekurencyjnych
fileList=(**/*.csv)
Opcja **
polega na ponownym przechodzeniu przez podfoldery i *.csv
jest 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ć ls
wyraż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 find
poleceniu). Dla przykładu rozważmy przypadek konieczności, aby wszystkie pliki graficzne rekurencyjnych czyli rozszerzeń *.gif
, *.png
a *.jpg
wszystko, 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 bash
powłokach, ta opcja nie byłaby właściwa.