Podczas gdy używam BASH od kilku lat, moje doświadczenie ze skryptowaniem BASH jest stosunkowo ograniczone.
Mój kod jest jak poniżej. Powinien pobrać całą strukturę katalogów z bieżącego katalogu i zreplikować ją $OUTDIR
.
for DIR in `find . -type d -printf "\"%P\"\040"`
do
echo mkdir -p \"${OUTPATH}${DIR}\" # Using echo for debug; working script will simply execute mkdir
echo Created $DIR
done
Problem polega na tym, że oto przykład mojej struktury plików:
$ ls
Expect The Impossible-Stellar Kart
Five Iron Frenzy - Cheeses...
Five Score and Seven Years Ago-Relient K
Hello-After Edmund
I Will Go-Starfield
Learning to Breathe-Switchfoot
MMHMM-Relient K
Zwróć uwagę na spacje: -S I for
pobiera parametry słowo po słowie, więc wynik mojego skryptu wygląda mniej więcej tak:
Creating directory structure...
mkdir -p "/myfiles/multimedia/samjmusicmp3test/Learning"
Created Learning
mkdir -p "/myfiles/multimedia/samjmusicmp3test/to"
Created to
mkdir -p "/myfiles/multimedia/samjmusicmp3test/Breathe-Switchfoot"
Created Breathe-Switchfoot
Ale potrzebuję go, aby pobrać całe nazwy plików (jedna linia na raz) z wyjścia find
. Próbowałem też robić find
umieszczaj podwójne cudzysłowy wokół każdej nazwy pliku. Ale to nie pomaga.
for DIR in `find . -type d -printf "\"%P\"\040"`
A wyjście z tą zmienioną linią:
Creating directory structure...
mkdir -p "/myfiles/multimedia/samjmusicmp3test/"""
Created ""
mkdir -p "/myfiles/multimedia/samjmusicmp3test/"Learning"
Created "Learning
mkdir -p "/myfiles/multimedia/samjmusicmp3test/to"
Created to
mkdir -p "/myfiles/multimedia/samjmusicmp3test/Breathe-Switchfoot""
Created Breathe-Switchfoot"
Teraz potrzebuję jakiegoś sposobu, aby przejść przez to w ten sposób, ponieważ chcę też uruchomić bardziej skomplikowane polecenie gstreamer
na każdym pliku w następującej podobnej strukturze. Jak mam to robić?
Edytować: Potrzebuję struktury kodu, która pozwoli mi uruchomić wiele linii kodu dla każdego katalogu / pliku / pętli. Przepraszam, jeśli byłam niejasna.
Rozwiązanie: Początkowo próbowałem:
find . -type d | while read DIR
do
mkdir -p "${OUTPATH}${DIR}"
echo Created $DIR
done
W większości działało to dobrze. Jednak później odkryłem, że ponieważ potok powoduje pętlę while działającą w podpowłoce, później wszystkie zmienne ustawione w pętli były niedostępne, co utrudniało implementację licznika błędów. Moje ostateczne rozwiązanie (od ta odpowiedź na SO ):
while read DIR
do
mkdir -p "${OUTPATH}${DIR}"
echo Created $DIR
done < <(find . -type d)
To później pozwoliło mi warunkowo zwiększyć zmienne w pętli, które pozostałyby dostępne później w skrypcie.
/
i niedrukowalne znaki. Ale wszystko jest dozwolone z wyjątkiem /
i \0
więc musisz im pozwolić.