Главная страница
Вход
Логин: Пароль:Забыли пароль?
Запомнить вас на этом компьютере?

Здравствуйте, гость ( Вход | Регистрация )

Скрыть объявления

Объявления

Форумы в Telegram - @vladforum С темами, всё как на форуме, только в Telegram!

> Экранирование пробелов в Bash, вопрос к знатокам :-)
ÄÄÄ
сообщение 25.2.2006, 16:40
Сообщение #1


Одинокий гитарист

Группа: Администратор 
Сообщений: 40 367
Регистрация: 30.9.2001
Пользователь №: 592
Вставить ник Цитата


Понадобилось мне тут написать простенький скриптик, чтобы по каталогам пробежался. Файлов и каталогов много, мелких, с запутанной структурой - разгребать всё это руками совершенно нереально.

Проблема заключается в том, что имена каталогов и файлов - с пробелами. Поэтому то, чем я привык оперировать, не работает.

итак, вот что имеем:

Код

[aaa@aaa test]$ find * -print
каталог с пробелами
каталог с пробелами/файл с пробелами.ф


Как видите, это я создал тестовый каталог и тестовый файл.

Далее, естественно, беру эти имена в кавычки:


Код

[aaa@aaa test]$ find * -print | sed -e 's/.*/"&"/g'
"каталог с пробелами"
"каталог с пробелами/файл с пробелами.ф"


Казалось бы - дальше надо всего лишь скормить всё это в цикле нужной мне команде (на самом деле, мне нужна комбинация iconv, mv, tar - но это не суть). Делаю:

Код

[aaa@aaa test]$ for f in `find * -print | sed -e 's/.*/"&"/g'`; do echo "$f"; done
"каталог
с
пробелами"
"каталог
с
пробелами/файл
с
пробелами.ф"


Как видно, пробелы в именах всё равно являются разделителями.

Я пробовал заэкранировать их обратным слешем:

Код

for f in `find * -print | sed -e 's/.*/"&"/g' | sed -e 's/ /\\ /g'`; do echo "$f"; done


но результат получил тот же. :-(

Я не суперспециалист в шелле (как-то особо никогда не требовалось) - и наверняка упускаю из вида какую-то мелочь. Никто, случаем, не видит - какую? :-)


--------------------
Что, устав от поднятой ВЕКом пыли, русский глаз отдохнёт на Солсбереццком шпиле
Перейти в начало страницы
 
+Цитировать сообщение
 
Начать новую тему
Ответов
keeper
сообщение 25.2.2006, 23:06
Сообщение #2


Постоянный посетитель

Группа: Пользователи 
Сообщений: 875
Регистрация: 23.8.2002
Из: Rainbow
Пользователь №: 1 744
Вставить ник Цитата


-L number
Call utility for every number lines read. If EOF is reached and fewer lines have been read than number then utility will be called with the available lines.

xargs.c,v 1.6 2002/02/23 05:27:47 (FreeBSD 6.0)

P.S. Ключ -n есть? Эффект будет сходный:

-n number
Set the maximum number of arguments taken from standard input for each invocation of utility. An invocation of utility will use less than number standard input arguments if the number of bytes accumulated (see the -s option) exceeds the specified size or there are fewer than number arguments remaining for the last invocation of utility. The current default value for number is 5000.


Сообщение отредактировал keeper - 25.2.2006, 23:13


--------------------
"Mittler zwischen Hirn und Händen muss das Herz sein"
Перейти в начало страницы
 
+Цитировать сообщение

Сообщений в этой теме


  Ответить в данную темуНачать новую тему
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 




RSS       Политика конфиденциальности
Легкая версия