Перейти к содержимому
baph

[bash] обработка путей с пробелами

Рекомендуемые сообщения

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

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

Не работает.

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

можно так:

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Создайте аккаунт или войдите в него для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!

Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас

×