Перейти к содержанию

[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

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

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

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
×
×
  • Создать...