У меня есть bash shell script, который проходит через все дочерние каталоги (но не файлы) определенного каталога. Проблема в том, что некоторые имена каталогов содержат пробелы.
Вот содержимое моего тестового каталога:
$ls -F test
Baltimore/ Cherry Hill/ Edison/ New York City/ Philadelphia/ cities.txt
И код, проходящий через каталоги:
for f in `find test/* -type d`; do
echo $f
done
Здесь вывод:
test/Baltimore test/Cherry Hill test/Edison test/New York City test/Philadelphia
Черри-Хилл и Нью-Йорк рассматриваются как 2 или 3 отдельные записи.
Я пробовал процитировать имена файлов, например:
for f in `find test/* -type d | sed -e 's/^/\"/' | sed -e 's/$/\"/'`; do
echo $f
done
но безрезультатно.
Там должен быть простой способ сделать это.
Ниже приведены ответы. Но чтобы сделать это более сложным - я не всегда хочу использовать каталоги, перечисленные в моем тестовом каталоге. Иногда я хочу передать имена каталогов в качестве параметров командной строки.
Я взял предложение Чарльза установить IFS и придумал следующее:
dirlist="${@}"
(
[[ -z "$dirlist" ]] && dirlist=`find test -mindepth 1 -type d` && IFS=$'\n'
for d in $dirlist; do
echo $d
done
)
и это работает отлично, если в аргументах командной строки нет пробелов (даже если эти аргументы цитируются). Например, вызывая script следующим образом: test.sh "Cherry Hill" "New York City"
производит следующий вывод:
Cherry Hill New York City