2015-05-05 12 views
5

Piszę skrypt powłoki, w którym muszę pętli ponad katalogów, a następnie pętli nad plikami w nich. Więc pisałem tę funkcję:Pętla na pustej zawartości katalogu w Bash

loopdirfiles() { 
    #loop over dirs 
    for dir in "${PATH}"/* 
    do 
     for file in "${dir}"/* 
      do 
       echo $file 
      done 
    done 
} 

Problemem jest to, że coś takiego echa * ścieżka/do/dir/** na pustych katalogów.

Czy istnieje sposób na wykorzystanie tego podejścia i zignorowanie tego rodzaju katalogów?

+1

Jeśli używasz 'PATH' jako zmienna w skrypcie ** nie **. Przerywasz uruchamianie zewnętrznych poleceń, ponieważ używa się do tego 'PATH'. Ogólnie należy unikać zmiennych ALL_CAPS (innych niż dla globali skryptu), ponieważ są one "zastrzeżone" dla powłoki/etc. posługiwać się. –

Odpowiedz

2

Można wyciąć * z nazwą katalogu zamiast całkowicie ignorując go:

[[ $file == *"*" ]] && file="${file/%\*/}" 
#this goes inside the second loop 

lub jeśli chcemy ignorować pusty katalog:

[[ -d $dir && $ls -A $dir) ]] || continue 
#this goes inside the first loop 

Innym sposobem:

files=$(shopt -s nullglob dotglob; echo "$dir"/*) 
((${#files})) || continue 
#this goes inside the first loop 

Albo można włączyć nullglob (wspomniane przez Etan Reisner) i dotglob sumie:

shopt -s nullglob dotglob 
#This goes before first loop. 


From Bash Manual

nullglob

Jeśli jest ustawiona, bash pozwala wzorców nazw plików, które pasują do żadnych plików Rozszerz na łańcuch pusty, a nie na siebie.

dotglob

Jeśli ustawione, bash zawiera nazwy plików zaczynające się od „” w wynikach filename ekspansji.

Uwaga: dotglob zawiera ukryte pliki (pliki z . na początku w nazwie)

+0

Uruchamianie 'ls' na nieudanym globusie w celu określenia, czy błąd globu jest stosunkowo kosztownym testem do tego celu. –

+0

@EtanReisner, Jest na pierwszej pętli, gdzie glob nie zawodzi. – Jahid

+0

Ah true. To wciąż stosunkowo drogi sposób na sprawdzenie tej sytuacji, ponieważ nieudany glob jest łatwo wykrywalny (jeśli nie unikniesz problemu z 'nullglob'). –

4

Możesz włączyć nullglob option. Powoduje to, że globusy, które nie mają odpowiedników, rozszerzają się do pustej listy, zamiast pozostawiać ją nierozwiniętą.

shopt -s nullglob 
+0

Ustawiłem tę opcję poza funkcją i dałem taki sam wynik. – lerp90

+0

Upewnij się, że używasz 'bash', a nie' sh' i upewnij się, że ustawiłeś to w tej samej sesji powłoki, której spodziewasz się użyć (np. Ustawiając ją w bieżącej powłoce, a następnie uruchamiając skrypt z tą funkcją nie będzie Zobacz to). –

Powiązane problemy