Próbuję napisać skrypt, który zostanie uruchomiony w danym katalogu z wieloma podkatalogami na jednym poziomie. Skrypt przejdzie do każdego z podkatalogów, wykona polecenie na plikach w katalogu i wyda polecenie cd, aby przejść do następnego katalogu. Jak najlepiej to zrobić?
shell-script
Coś Jones
źródło
źródło
youtube-dl
.Odpowiedzi:
źródło
for d in ./*/
uruchamia pętlę, w której zapisywany jest każdy element./*/
(w tym przypadku lista plików / folderów) w zmiennej$d
.do (cd "$d" && somecommand);
uruchamia ciało pętli. Wewnątrz ciała uruchamia podpowłokę i uruchamia poleceniacd
isomecommand
. Ponieważ jest to powłoka podrzędna, powłoka nadrzędna (powłoka, z której uruchamiane jest to polecenie), zachowuje CWD i inne zmienne środowiskowe.done
po prostu zamyka korpus pętli.for d in ./*/ ; do (cd "$d" && ls); done
nie będzie działać. alefor d in ./*/ ; do (cd "$d" && for d in ./*/ ; do (cd "$d" && ls); done ); done
zadziała. -korzystanie z ls jako polecenia w tym przykładzie.-bash: cd: ./*/: No such file or directory
Najlepszym sposobem jest w ogóle nie używać
cd
:execdir
jest jakexec
, ale katalog roboczy jest inny:To nie jest POSIX.
źródło
find
wykonuje te polecenia, więc nie byłby świadomy aliasów. Co tomd
jest.link
katalog?bash
:find . -type f -iname '*.link' -execdir ${BASH_ALIASES[md]} -i {} \;
Nie trzeba robićcat
zwget
, który ma-i
flagę do czytania w URL z pliku. Również nieco różni się to od twojego pierwotnego pytania (ponieważ wydaje się, że jesteś zainteresowany tylko nazwanymi plikami,.link
a nie innymi, które mogą być obecne).Powyższe polecenie nie musi wykonywać żadnych podpowłok - po prostu śledzi swoje postępy w bieżącej powłoce na przemian
$OLDPWD
i$PWD
. Kiedy tycd -
powłoka wymienia wartość tych dwóch zmiennych, w zasadzie, ponieważ zmienia katalogi. Wyświetla także nazwę każdego katalogu, ponieważ działa tam na stderr.Właśnie rzuciłem na to okiem i zdecydowałem, że lepiej sobie radzę z obsługą błędów. Pominie katalog, do którego nie może
cd
- icd
wydrukuje komunikat o tym, dlaczego stderr - ibreak
w / niezerowy kod wyjścia, jeślicommand
nie zostanie wykonany pomyślnie lub jeśli uruchomienie wcommand
jakiś sposób wpłynie na jego zdolność do powrotu do oryginalnego katalogu -$OLDPWD
. W takim przypadku wykonuje równieżcd -
ostatni - i zapisuje wynikową bieżącą nazwę katalogu roboczego do stderr.źródło
źródło