Chcę, aby mój skrypt powłoki odwiedził wszystkie podkatalogi w katalogu głównym. Zrób coś w katalogach, wyślij dane wyjściowe do pliku buforowania i przejdź do następnego katalogu. Rozważ główny katalog = / tmp podkatalog = ABCD (cztery podkatalogi)
bash
shell-script
Ashish
źródło
źródło
Odpowiedzi:
Użyj
for
pętli:Przeszukuje tylko podkatalogi katalogu
/path/to/dir
. Zauważ, że powyższy prosty przykład zawiedzie, jeśli nazwy katalogów zawierają spacje lub znaki specjalne. Bezpieczniejsze podejście to:Lub wprost
bash
:(zauważ, że w przeciwieństwie do
find
tego rozważa również dowiązania symboliczne do katalogów i wyklucza ukryte)źródło
find
podobnych wyników.date +"%m%d20%Y"
| xargs echo echo $ ddate +"%m%d20%Y"
| xargs echo echo $ d Oczekiwany wynik to ls -ltr ze wszystkich podkatalogów . Powyższa pętla nie działaJestem kompletnym
bash
nowicjuszem, ale weteranem ONZ * X. Chociaż niewątpliwie można tego dokonać w skryptach powłoki Bash, w dawnych czasach to robiliśmyfind [-maxdepth <levels>] <start-dir> -exec <command> ;
. Możesz zrobićman find
i bawić się, może dopóki ktoś nie powie ci, jak to zrobićbash
!źródło
find
poleceń zewnętrznych .$(find...)
o złą praktykę .Wygląda na to, że chcesz mieć nazwy plików w każdym podkatalogu;
ls -l | awk
nie jest wystarczająco wytrzymała, na co, jeśli te nazwy plików zawierają białymi znakami i / lub znaki nowej linii? Poniższefind
działałoby nawet dlafind
tych, którzy nie mają-maxdepth
szans na ich spełnienie :źródło
Mam rozwiązanie. Poniższe polecenie find spełnia moje wymagania.
źródło
Jest to również możliwe przy użyciu ls, grep i tr
du / sed może być również używany jako selektor, jeśli twojemu ls brakuje powyższych opcji
Warto pamiętać, że te przykłady zwracają ukryte katalogi i wykluczają katalogi nadrzędne i bieżące
źródło
ls
zapisuje jeden plik w wierszu (co-1
określa opcja), gdy standardowym wyjściem jest potok (więc jest zbyteczny w twoich odpowiedziach). (2) Analiza wynikuls
jest złym pomysłem - zobacz to i to . Twoja pierwsza odpowiedź nie powiedzie się, jeśli katalogi mają spacje (lub znaki nowej linii) w swoich nazwach, a wszystkie zawiodą, jeśli będą miały nazwy nowych linii. (3) Zawsze powinieneś cytować zmienne powłoki (np."$dir"
), Chyba że masz dobry powód, aby tego nie robić i jesteś pewien, że wiesz, co robisz.