baph Posted November 8, 2010 Report Posted November 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" Не работает. Поможите, люди добрые!! Quote
AccessD Posted November 8, 2010 Report Posted November 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 Quote
gogi Posted November 10, 2010 Report Posted November 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 Quote
baph Posted November 12, 2010 Author Report Posted November 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 Замечание об утилите в начале моего сообщения, похоже, было лишнее. Quote
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.