![]() |
Здравствуйте, гость ( Вход | Регистрация )
![]() |
![]()
Сообщение
#1
|
|||||||||
![]() Одинокий гитарист Группа: Администратор Сообщений: 40 367 Регистрация: 30.9.2001 Пользователь №: 592 Вставить ник Цитата ![]() |
Понадобилось мне тут написать простенький скриптик, чтобы по каталогам пробежался. Файлов и каталогов много, мелких, с запутанной структурой - разгребать всё это руками совершенно нереально. Проблема заключается в том, что имена каталогов и файлов - с пробелами. Поэтому то, чем я привык оперировать, не работает. итак, вот что имеем:
Как видите, это я создал тестовый каталог и тестовый файл. Далее, естественно, беру эти имена в кавычки:
Казалось бы - дальше надо всего лишь скормить всё это в цикле нужной мне команде (на самом деле, мне нужна комбинация iconv, mv, tar - но это не суть). Делаю:
Как видно, пробелы в именах всё равно являются разделителями. Я пробовал заэкранировать их обратным слешем:
но результат получил тот же. :-( Я не суперспециалист в шелле (как-то особо никогда не требовалось) - и наверняка упускаю из вида какую-то мелочь. Никто, случаем, не видит - какую? :-) -------------------- Что, устав от поднятой ВЕКом пыли, русский глаз отдохнёт на Солсбереццком шпиле
|
||||||||
|
|||||||||
| |
![]() |
![]()
Сообщение
#2
|
|
![]() Одинокий гитарист Группа: Администратор Сообщений: 40 367 Регистрация: 30.9.2001 Пользователь №: 592 Вставить ник Цитата ![]() |
Кстати - я прекрасно понимаю, что в этом случае можно напустить хоть перл, хоть ещё что-нибудь подобное на то, что уже есть - имена файлов/каталогов в кавычках - но не хочется городить дополнительные огороды - тем более, что есть ощущение что не хватает какой-то мелочи. :-)
-------------------- Что, устав от поднятой ВЕКом пыли, русский глаз отдохнёт на Солсбереццком шпиле
|
|
|
![]()
Сообщение
#3
|
|||||||
![]() Новенький Группа: Пользователи Сообщений: 1 331 Регистрация: 28.8.2003 Пользователь №: 3 548 Вставить ник Цитата ![]() |
Все нужные команды помещаем в sh-файл (e.g. process.sh):
и потом
|
||||||
|
|||||||
![]()
Сообщение
#4
|
|||
![]() Новенький Группа: Пользователи Сообщений: 1 331 Регистрация: 28.8.2003 Пользователь №: 3 548 Вставить ник Цитата ![]() |
Ну, а чтобы наверняка, пишем в process.sh:
|
||
|
|||
![]()
Сообщение
#5
|
|
![]() Постоянный посетитель Группа: Пользователи Сообщений: 875 Регистрация: 23.8.2002 Из: Rainbow Пользователь №: 1 744 Вставить ник Цитата ![]() |
Имхо можно проще. man find, man xargs, искать ключ -print0.
--------------------
"Mittler zwischen Hirn und Händen muss das Herz sein"
|
|
|
![]()
Сообщение
#6
|
|
![]() Одинокий гитарист Группа: Администратор Сообщений: 40 367 Регистрация: 30.9.2001 Пользователь №: 592 Вставить ник Цитата ![]() |
Парни! Спасибо, конечно, за участие. Но вы бы хоть, честное слово, проверяли, что советуете! :-)
savagex Проблема у меня не в организации всего этого дела. А в пробелах! Твои предложения проблему пробелов нисколько не решают: ведь всё, что передаётся в обрабатывающий скрипт, на параметры разделяется пробелами. И sed -e 's/ /\\\ /g'` (кстати - а почему три обратных слеша? впрочем, это, наверное, описка) точно так же не помогает, как не помог и мне. В общем-то, и не удивительно: твоё решение практически не отличается от моего - у меня делается, по сути, то же самое - только подстановкой. keeper Антон... слово man я и так прекрасно знаю. С этим затруднений нет. Я написал, с чем затруднения-то есть. У меня как раз изначально и было - for f in `find * -print0 | xargs -0` ; do ... Но дело-то в том, что чем бы ни разделять эти имена - даже нулевым символом, как в данном случае - дальше они попадают со стандартного входа в последний аргумент xargs - команду. Которая точно так же уже не воспринимает пробелы... -------------------- Что, устав от поднятой ВЕКом пыли, русский глаз отдохнёт на Солсбереццком шпиле
|
|
|
![]()
Сообщение
#7
|
|
![]() Постоянный посетитель Группа: Пользователи Сообщений: 875 Регистрация: 23.8.2002 Из: Rainbow Пользователь №: 1 744 Вставить ник Цитата ![]() |
Основной вызов:
find * -print0 | xargs -0 -L 1 special.sh special.sh: echo New entry! echo $1 | iconv -f koi8-r -t cp1251 --------------------
"Mittler zwischen Hirn und Händen muss das Herz sein"
|
|
|
![]()
Сообщение
#8
|
|||
![]() Одинокий гитарист Группа: Администратор Сообщений: 40 367 Регистрация: 30.9.2001 Пользователь №: 592 Вставить ник Цитата ![]() |
Что за опция L такая? У меня такой нет... [aaa@aaa test]$ xargs --version GNU xargs версии 4.1.20 -------------------- Что, устав от поднятой ВЕКом пыли, русский глаз отдохнёт на Солсбереццком шпиле
|
||
|
|||
![]()
Сообщение
#9
|
|
![]() Постоянный посетитель Группа: Пользователи Сообщений: 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"
|
|
|
![]()
Сообщение
#10
|
|||
![]() Новенький Группа: Пользователи Сообщений: 1 331 Регистрация: 28.8.2003 Пользователь №: 3 548 Вставить ник Цитата ![]() |
InrecoAAA - каюсь, тестировал недостаточно тщательно. Проблема с пробелами в sh заключается в том, что ни в `...`, ни в "...", ни в переменных, экранирование пробелов не работает. Т.е. даже если echo $1 выводит: a\ b\ c/ то это не значит что будет работать, к примеру, mv $1 destdirname Обходной маневр - это опять же xargs, только не так как предлагает keeper, а по другому :) Ниже приведен абстрактный, но рабочий пример по выводу содержимого найденных файлов.
Данный вариант был всячески оттестирован и признан годным к использованию :) ЗЫ: Три бэкслеша - это не описка. Сообщение отредактировал savagex - 26.2.2006, 1:17 |
||
|
|||
![]()
Сообщение
#11
|
|
![]() Одинокий гитарист Группа: Администратор Сообщений: 40 367 Регистрация: 30.9.2001 Пользователь №: 592 Вставить ник Цитата ![]() |
keeper
В моей версии, как оказалось, есть ключ -l :-), который делает то же самое. В принципе, это вариант, спасибо! - хотя придётся городить чуть больший огород. savagex Ага, в сторону -J % я вчера тоже копал как раз. Думаю, удастся соорудить что-то работоспособное в итоге. Так что тоже спасибо! :-) По поводу слешей - ну да, у меня же в "что искать" пробел слешем не экранировался, соответственно и в "на что заменять" тоже. :-) Ну это мелочи. :-) -------------------- Что, устав от поднятой ВЕКом пыли, русский глаз отдохнёт на Солсбереццком шпиле
|
|
|
![]() ![]() |
![]() |
Политика конфиденциальности | Легкая версия |