У мене є скрипт bash shell, який проходить через усі дочірні каталоги (але не файли) певного каталогу. Проблема полягає в тому, що деякі імена каталогів містять пробіли.
Ось вміст мого тестового каталогу:
$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 Hill та New York City розглядаються як 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="$@"
повністю відкидає список-ності оригінального значення, згортаючи його на рядок. Будь ласка, дотримуйтесь практик у моїй відповіді точно так, як зазначено - таке завдання ніде не рекомендується; якщо ви хочете передати список аргументів командного рядка програмі, вам слід зібрати їх у масив та безпосередньо розгорнути цей масив.