У меня есть сценарий оболочки 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
Вот результат:
тест / Балтимор Испытание / Cherry возвышенность Тест / Edison Тест / New Йорк город тест / Филадельфия
Черри-Хилл и Нью-Йорк рассматриваются как 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"
дает следующий результат:
вишня возвышенность новый Йорк город
list="$@"
полностью отбрасывает исходное значение списком, сворачивая его в строку. Пожалуйста, следуйте практике , изложенной в моем ответе, в точности так, как дано - такое задание нигде в нем не поощряется; если вы хотите передать программе список аргументов командной строки, вы должны собрать их в массив и напрямую расширить этот массив.