baph Опубликовано 8 ноября, 2010 Жалоба Поделиться Опубликовано 8 ноября, 2010 Здравствуйте. Пытаюсь написать скрипт, который создаст в текущей папке папки с именами, полученными от какой-либо утилиты (в данном случае - ls): $ ls -1 ~/test abcd dcba test1 test1 test2 test1 test2 test3 , содержащие папку done. Написал следующий скрипт: for i in $(ls -1 ~/test) ; do echo ${i} if [ -d ~/test/$i ] ; then echo "making ${i}/done dir" mkdir -p ${i}/done fi done Пока не смог понять, как обрабатывать в цикле имена, содержащие пробелы. Если выполнить for i in $(ls -1 ~/test) ; do echo ${i}; done abcd dcba test1 test1 test2 test1 test2 test3 Т.е., как я понял, баш интерпретирует пробелы в именах как разделители переменных. Если выполнить $ for i in "$(ls -1 ~/test)" ; do #добавил кавычки echo ${i}; done abcd dcba test1 test1 test2 test1 test2 test3 $ echo "${i}" abcd dcba test1 test1 test2 test1 test2 test3 т.е. переменной i один раз присваивается вывод ls -1 ~/test, и выполнение $ mkdir -p ${i}/done приводит к $ find -maxdepth 2 | sort . ./abcd ./catalogue ./config ./dcba ./test1 ./test2 ./test3 ./test3/done Попробовал добавлять кавычки к именам папок: DIRS=$(ls -1 ~/test | sed -r 's|^(.*)$|\"\1\"|g') ; for i in ${DIRS} ; do echo "${i}" ; done "abcd" "dcba" "test1" "test1 test2" "test1 test2 test3" Не работает. Поможите, люди добрые!! Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
AccessD Опубликовано 8 ноября, 2010 Жалоба Поделиться Опубликовано 8 ноября, 2010 можно так: Есть каталог 1, в нём каталоги 2 3 в кат. 1/2 файлы: test 1 test 2 Пример выполняется в кат. 1: ls -1 2 | sed -e 's/ /\\ /' | xargs -n1 -i mkdir 3/{} После этого имеем в 1/3 каталоги: test 1 tets 2 Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
gogi Опубликовано 10 ноября, 2010 Жалоба Поделиться Опубликовано 10 ноября, 2010 baph писал(а) Mon, 08 November 2010 20:53 Написал следующий скрипт: for i in $(ls -1 ~/test) ; do echo ${i} if [ -d ~/test/$i ] ; then echo "making ${i}/done dir" mkdir -p ${i}/done fi done Пока не смог понять, как обрабатывать в цикле имена, содержащие пробелы. Радует интерес к скриптописанию. AccessD показал Вам, как можно заэкранировать пробелы с помощью утилиты sed. Предложу еще два варианта решения проблемы c минимальным изменением Вашего кода. 1. IFS=\n for i in $(ls -1 ~/test) ; do echo "$i" done 2. ls -1 ~/test | while read i; do echo "$i" done Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
baph Опубликовано 12 ноября, 2010 Автор Жалоба Поделиться Опубликовано 12 ноября, 2010 Сначала тоже пришел к: ls -1 ~/test/ | while read i ; do mkdir -p "~/test/${i}/done" done Так как не смог придумать, как подавить лишний в моем случае вывод ls, использовал следующий вариант: for D in ~/test/*; do [ -d "$D" ] && mkdir -p "${D}/done"; done Замечание об утилите в начале моего сообщения, похоже, было лишнее. Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения
Присоединяйтесь к обсуждению
Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.