У меня есть скрипт оболочки bash, который перебирает все дочерние каталоги (но не файлы) определенного каталога. Проблема в том, что некоторые имена каталогов содержат пробелы.
Вот содержимое моего тестового каталога:
$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
)
и это прекрасно работает, если в аргументах командной строки нет пробелов (даже если эти аргументы указаны в кавычках). Например, вызов сценария следующим образом: test.sh "Cherry Hill" "New York City"
дает следующий вывод:
Cherry
Hill
New
York
City