Закавычить find (вернее результат поиска)

Модератор: Модераторы разделов

George Shot
Сообщения: 34
ОС: All

Закавычить find

Сообщение George Shot »

развлекаюсь на bash
После поиска find выдает список файлов в имени или пути которых есть пробелы, что вызывает проблему дальнейшей обработки
Как проще закавычить этот полный путь с именем для всех результатьв поиска
для последующей обработки
Спасибо сказали:
Аватара пользователя
nesk
Сообщения: 2268
Статус: Линукссаксовец
ОС: MS Windows XP Home SP3

Re: Закавычить find

Сообщение nesk »

Покажите код, как Вы пытаетесь обработать вывод find
если с помощью read то просто потом надо ковычить переменную (для read главное что бы в имени файлов не было переносов строк, а на пробелы он реагирует нормально)
Внимание: У меня под рукой нет машины с Linux. Я не использую эту ОС. Ответы я даю либо по памяти, либо мне помогает гугл. Тщательно читайте маны по тем командам и конфигурационным файлам, которые я упоминаю.

0xDEFEC8ED
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: Закавычить find

Сообщение drBatty »

George Shot писал(а):
01.05.2009 13:45
Как проще закавычить этот полный путь с именем для всех результатьв поиска
для последующей обработки

лично я ту-же проблему решил не заковычиванием, а экранированием.
а команда редактирования потока называется sed. ей можно впрочем и заковычить(наверное).
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
nesk
Сообщения: 2268
Статус: Линукссаксовец
ОС: MS Windows XP Home SP3

Re: Закавычить find

Сообщение nesk »

drBatty писал(а):
01.05.2009 14:06
лично я ту-же проблему решил не заковычиванием, а экранированием.

Это одно и тоже! кавычки " и ' - спецсимволы экранирования как и символ \
drBatty писал(а):
01.05.2009 14:06
а команда редактирования потока называется sed. ей можно впрочем и заковычить(наверное).

Ей ей конечно можно добавить кавычки к началу и концу каждой строки, но это не принесет желаемого результата.
Внимание: У меня под рукой нет машины с Linux. Я не использую эту ОС. Ответы я даю либо по памяти, либо мне помогает гугл. Тщательно читайте маны по тем командам и конфигурационным файлам, которые я упоминаю.

0xDEFEC8ED
Спасибо сказали:
George Shot
Сообщения: 34
ОС: All

Re: Закавычить find

Сообщение George Shot »

nesk писал(а):
01.05.2009 14:00
Покажите код, как Вы пытаетесь обработать вывод find


скрипт упрощенно чтото типа:

for j in `find /tmp/test -mtime -1`

do
echo $j;

done

в результате например от файла с именем "целый файл" получаем вывод в 2 строки

/tmp/test/целый
файл
Спасибо сказали:
Аватара пользователя
nesk
Сообщения: 2268
Статус: Линукссаксовец
ОС: MS Windows XP Home SP3

Re: Закавычить find

Сообщение nesk »

надо так:
find /tmp/test -mtime -1 | while read j; do echo "$j" ; done
Внимание: У меня под рукой нет машины с Linux. Я не использую эту ОС. Ответы я даю либо по памяти, либо мне помогает гугл. Тщательно читайте маны по тем командам и конфигурационным файлам, которые я упоминаю.

0xDEFEC8ED
Спасибо сказали:
George Shot
Сообщения: 34
ОС: All

Re: Закавычить find

Сообщение George Shot »

nesk писал(а):
01.05.2009 14:39
надо так:
find /tmp/test -mtime -1 | while read j; do echo "$j" ; done


спасибо, похоже то что надо, оч. оперативно
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: Закавычить find

Сообщение drBatty »

nesk писал(а):
01.05.2009 14:13
ей конечно можно добавить кавычки к началу и концу каждой строки, но это не принесет желаемого результата.
ну мне же принесло.
такой командой sed:

Код: Выделить всё

s/[] ()[]/\\&/2g

двойка - потому что дальше будет

Код: Выделить всё

s/:/file/ep

которая поменяет : на file, и выполнит эту команду. вот что-бы пробел после file не экранировать.
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
pcodr
Сообщения: 283
ОС: Debian

Re: Закавычить find

Сообщение pcodr »

Также можно так

Код: Выделить всё

IFS=$'\n'
for j in `find /tmp/test -mtime -1`
do
      echo $j;
done
remote system type is unix
Спасибо сказали:
Аватара пользователя
nesk
Сообщения: 2268
Статус: Линукссаксовец
ОС: MS Windows XP Home SP3

Re: Закавычить find

Сообщение nesk »

pcodr писал(а):
01.05.2009 19:49
Также можно так

Можно, но только осторожно.
Не понятно как это может повлиять на аргументы других команд.
Внимание: У меня под рукой нет машины с Linux. Я не использую эту ОС. Ответы я даю либо по памяти, либо мне помогает гугл. Тщательно читайте маны по тем командам и конфигурационным файлам, которые я упоминаю.

0xDEFEC8ED
Спасибо сказали:
Аватара пользователя
Red User
Сообщения: 229
ОС: Debian

Re: Закавычить find

Сообщение Red User »

nesk писал(а):
01.05.2009 14:39
надо так:
find /tmp/test -mtime -1 | while read j; do echo "$j" ; done

Код: Выделить всё

$ touch "ddd eee"
$ touch $'fff\nggg'
$ find ./ -mtime -1 | while read j; do echo "$j"; done
./
./ddd eee
./fff
ggg
А ведь когда-то не боялись мы программы любой,
И с одним лишь debug'ом выходили на бой,
И искусно написанный вирус встречали как брата
Спасибо сказали:
Аватара пользователя
nesk
Сообщения: 2268
Статус: Линукссаксовец
ОС: MS Windows XP Home SP3

Re: Закавычить find

Сообщение nesk »

Red User писал(а):
01.05.2009 20:16
$ touch $'fff\nggg'

Это всем известно. Читай выше.
nesk писал(а):
01.05.2009 14:00
(для read главное что бы в имени файлов не было переносов строк, а на пробелы он реагирует нормально)


Предложите свой вариант.

PS Если набор действий над результатом поиска небольшой, то наверно проще всего использовать ключ -exec
find /tmp/test -mtime -1 -exec echo {} \;
Внимание: У меня под рукой нет машины с Linux. Я не использую эту ОС. Ответы я даю либо по памяти, либо мне помогает гугл. Тщательно читайте маны по тем командам и конфигурационным файлам, которые я упоминаю.

0xDEFEC8ED
Спасибо сказали:
Аватара пользователя
ZyX
Сообщения: 355
ОС: Gentoo

Re: Закавычить find

Сообщение ZyX »

А зачем закавычивать? У меня в zsh всё и так нормально:

zyx@zyx-desktop

(zyx:~/tmp) % ls -1 *\ * {[]} ()!&| {\[]} ()!&| test . test2 . test3 . (zyx:~/tmp) % ls -1 *\ * | while IFS='\n' read -r i ; do la $i ; done -rw-r--r-- 1 zyx 0 Май 3 13:41 {[]} ()!&| -rw-r--r-- 1 zyx 0 Май 3 13:38 {\[]} ()!&| -rw-r--r-- 1 zyx 0 Май 3 13:35 test . -rw-r--r-- 1 zyx 0 Май 3 13:35 test2 . -rw-r--r-- 1 zyx 0 Май 3 13:35 test3 .

Если строки, выводимые ls не будут начинаться с пробельного символа, то указание
«IFS='\n'» не нужно:

zyx@zyx-desktop

(zyx:~/tmp) % ls -1 ./*\ * | while read -r i ; do la $i ; done -rw-r--r-- 1 zyx 0 Май 3 13:41 ./ {[]} ()!&| -rw-r--r-- 1 zyx 0 Май 3 13:38 ./{\[]} ()!&| -rw-r--r-- 1 zyx 0 Май 3 13:35 ./test . -rw-r--r-- 1 zyx 0 Май 3 13:35 ./test2 . -rw-r--r-- 1 zyx 0 Май 3 13:35 ./test3 .

Кстати, всё ваши примеры с read сломаются, если в имени файла будет обратная
косая черта.

Добавлено: Заметил, что мой пример ломается, если в имени файла
присутствует и «\n», и «\\n». На bash можно сделать то же самое, если вместо
«$i» писать «"$i"».

PS: alias la='ls -hlA'

PPS: Подумал, какая польза от такой замечательной zsh, если я не могу
придумать способа передать из find имя файла, который я не смог бы сломать.
Разве что попробовать использавать «-printf %D:%i» и обрабатывать номер
устройства и inode, а не имя файла.
Спасибо сказали:
Аватара пользователя
nesk
Сообщения: 2268
Статус: Линукссаксовец
ОС: MS Windows XP Home SP3

Re: Закавычить find

Сообщение nesk »

ZyX, привет. Обрати внимание на то, что у автора темы не работал пример с for
for j in `find .. ` ............
ну или в твоем случает
for j in `ls ..` ....
Как себя поведет zsh ?
Внимание: У меня под рукой нет машины с Linux. Я не использую эту ОС. Ответы я даю либо по памяти, либо мне помогает гугл. Тщательно читайте маны по тем командам и конфигурационным файлам, которые я упоминаю.

0xDEFEC8ED
Спасибо сказали: