Mam skrypt powłoki bash, który przechodzi przez wszystkie katalogi podrzędne (ale nie pliki) określonego katalogu. Problem polega na tym, że niektóre nazwy katalogów zawierają spacje.
Oto zawartość mojego katalogu testowego:
$ls -F test
Baltimore/ Cherry Hill/ Edison/ New York City/ Philadelphia/ cities.txt
Oraz kod, który przechodzi przez katalogi:
for f in `find test/* -type d`; do
echo $f
done
Oto wynik:
test / Baltimore test / Cherry Wzgórze test / Edison test / nowy York Miasto test / Philadelphia
Cherry Hill i Nowy Jork są traktowane jako 2 lub 3 osobne wpisy.
Próbowałem zacytować nazwy plików, na przykład:
for f in `find test/* -type d | sed -e 's/^/\"/' | sed -e 's/$/\"/'`; do
echo $f
done
ale bez skutku.
Musi być na to prosty sposób.
Odpowiedzi poniżej są świetne. Ale żeby to jeszcze bardziej skomplikować - nie zawsze chcę używać katalogów wymienionych w moim katalogu testowym. Czasami chcę zamiast tego przekazać nazwy katalogów jako parametry wiersza polecenia.
Przyjąłem sugestię Charlesa dotyczącą ustawienia IFS i wymyśliłem, co następuje:
dirlist="${@}"
(
[[ -z "$dirlist" ]] && dirlist=`find test -mindepth 1 -type d` && IFS=$'\n'
for d in $dirlist; do
echo $d
done
)
i działa to dobrze, chyba że w argumentach wiersza poleceń są spacje (nawet jeśli te argumenty są cytowane). Na przykład wywołanie skryptu w ten sposób: test.sh "Cherry Hill" "New York City"
daje następujący wynik:
wiśnia Wzgórze Nowy York Miasto
list="$@"
całkowicie odrzuca listę pierwotnej wartości, zwijając ją do łańcucha. Proszę postępować zgodnie z praktykami zawartymi w mojej odpowiedzi dokładnie tak, jak podano - nigdzie nie zachęca się do takiego przydziału; jeśli chcesz przekazać listę argumentów wiersza poleceń do programu, powinieneś zebrać je w tablicy i bezpośrednio rozwinąć tę tablicę.