Jump to content

Recommended Posts

Posted

Здравствуйте.

Пытаюсь написать скрипт, который создаст в текущей папке папки с именами, полученными от какой-либо утилиты (в данном случае - 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"

Не работает.

Поможите, люди добрые!!

Posted

можно так:

Есть каталог 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

Posted

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

Posted

Сначала тоже пришел к:

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

Замечание об утилите в начале моего сообщения, похоже, было лишнее.

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
×
×
  • Create New...