LINUX.ORG.RU

помочь с командой


0

0

народ, помогите, плиз, правильно задать команду для поиска файлов в папке и подпапках с заданным именем, и затем добавления в конец каждого из найденных текста попробовал так find . -name «123.php» -type f -exec cat text.txt >> {} \; что-то не выходит

> cat text.txt

попробуйте здесь полный путь до text.txt указать.

isden ★★★★★ ()

и для проверки, находится ли что вообще -

find . -name «123.php» -type f -print

isden ★★★★★ ()

>> не перенаправляет в несколько файлов. Советую tee:
| tee file1 file2

он еще делает вывод на экран.

Andaril ()

Попробуй:
for i in `find . -name «123.php» -type f -print`; do cat text.txt >> $i ; done

P.S.:
Если кто пояснит почему не пашет первый вариант, я буду благодарен.

a_n ()

> find . -name «123.php» -type f -exec cat text.txt >> {} \;

Вы её прямо в таком виде выполняете? Заэкранировали ";", а остальные спецсимволы баша экранировать нужно?

mky ★★★★★ ()
Ответ на: комментарий от a_n

>> find . -name «123.php» -type f -exec cat {} \; работает... Вводит это в заблуждение.

так {} не нужно экранировать, они для самого exec-а же.

mclaudt ()
Ответ на: комментарий от NightSpamer

Почему это будет второй командой? Ведь команда для exec должна завершаться \; Всё, что до этого - команда или не так?
Кстати, работает такая конструкция, но почему он подставляет значение для {} несмотря на то, что в кавычках..?
Не очень понятная мне ситуация.

a_n ()
Ответ на: комментарий от a_n

Ну не так выразился. -exec спотыкается на перенаправлениях. В детали не вдавался. А {} раскрывается независимо от кавычек, но только до перенаправления.

NightSpamer ()
Ответ на: комментарий от NightSpamer

Понятно. Спасибо. А только exec?
Кстати, ведь он, по-идее, должен парсить строку и выполнять, но такое:
find . -name «123.php» -type f -exec «cat text.txt >> {}» \;
не работает. Почему?
Вообще, получается, что >> прерывает первую команду и следующая за ним строка (или вывод команды) - это файл для добавления? Или нет?

a_n ()
Ответ на: комментарий от needed

Кстати, точно, у тебя появился в том каталоге, откуда ты запускал команду файл с именем «{}»?

a_n ()
Ответ на: комментарий от NightSpamer

Кажется я въехал. * раскрывается, очевидно и другие символы подстановки. {} - ничего не значит для bash, потому тут он используется.
Скользкий момент. Похоже, не все его понимают, а не только я.
Открыл ман по башу... В цигвине. %-) Ёптыть. Блин, там есть даже дублирование файловых дескрипторов, открытие для записи и чтения...
Дикие конструкции: [n]<>word, <<<word. Сложный он, блин, навороченный. :-(

a_n ()
Ответ на: комментарий от NightSpamer

Таки нет. Я не въехал. Но, почему, если экранируются \{\}, он работает нормально? Ведь, по идее, если после перенаправления - имя файла, то он, в любом случае, должен перенаправлять в файл с именем {}.
Чёрт. :-( Кто объяснит?

a_n ()
Ответ на: комментарий от Andaril

Помимо того, что в именах файлов могут быть пробелы, есть ещё ограничение на длину командной строки --- ограничение на кол-во файлов. Если уж делать tee, доводить до использования xargs и print0.

mky ★★★★★ ()
Ответ на: комментарий от a_n

Видимо, вы не совсем поняли. Спецсимволы баша в вашем случае были '>>'. При это спецсимволы (пернаправление) только для bash. То есть только bash понимает, что надо пренаправить вывод в файл.

То есть если делать:

find . -name «123.php» -type f -exec cat text.txt >> {} \;

То фактически выполниться команда 'find . -name «123.php» -type f -exec cat text.txt' с перенаправлением её вывода в файл с именем '{}'.

А если делать: find . -name «123.php» -type f -exec cat text.txt \>\> {} \; то для каждого файла будет выполняться команда cat с 3 аргументами: 'text.txt', '>>', '123.php'. И cat будет считать '>>' именем файла, а не указанием для перенаправления вывода.

mky ★★★★★ ()
Ответ на: комментарий от mky

> Видимо, вы не совсем поняли.
Угу, я не понял.

find . -name «123.php» -type f -exec cat text.txt \>\> {} \;

то для каждого файла будет выполняться команда cat с 3 аргументами:


'text.txt', '>>', '123.php'. И cat будет считать '>>' именем файла,


а не указанием для перенаправления вывода.


Это понятно. Аналогично возможно и просто в командной строке написать: cat \>\>, где >> - имя файла.
Но... echo 10 > {} && cat {} работает (хотя автоподстановка пытается экранировать скобки).
Т.е., экранируя спецсимволы я получаю -exec cat text.txt >> имя_найденного_файла, а не экранируя, -exec cat text.txt >> {}, где {} - кривое имя файла в текущей директории.
Почему, в случае с экранированием \{\}, find подставляет имя файла на место {} и всё работает? В чём разница?

a_n ()
Ответ на: комментарий от mky

Я в том смысле, что вот это (первый вариант команды автора темы):
find . -name «123.php» -type f -exec cat text.txt >> {} \;
не работает.

А вот это:
find . -name «123.php» -type f -exec cat text.txt >> \{\} \;
работает.

Хотя, по сути и то, и это - перенаправление в файл. И работать второй вариант не должен, также, как и первый. Почему же он работает?

a_n ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.