Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Операционные системы » UNIX » Помогите с командой find

Модерирует : ShriEkeR

 Версия для печати • ПодписатьсяДобавить в закладки

Открыть новую тему     Написать ответ в эту тему

gryu



дикий гусь
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Есть задача  найти все файлы по маске и обработать их.
Пишу  
find ./ -type f -name "*-em*" -exec lme.pl {} > {}-m \;
Но если первые {} срабатывают правильно, подставляется найденный файл, то вторые {} уже не срабатывают и результирующий файл получает имя {}-m, а "имя_файла-m"
Как заставить find подставлять найденное имя в обоих местах?
Оно конечно ясно "почему", но вопрос стоит "как сделать".

Всего записей: 13025 | Зарегистр. 15-03-2006 | Отправлено: 16:57 18-08-2010 | Исправлено: gryu, 17:22 18-08-2010
dekstero4eg

Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
gryu
вот мой вариант быдлокодинга
 
#!/usr/local/bin/bash
find ./ -type f -name "*te*" | while read i
do
exec /scripts/test.pl $i  > ${i}-m \;
done

Всего записей: 441 | Зарегистр. 29-06-2009 | Отправлено: 17:12 18-08-2010 | Исправлено: dekstero4eg, 17:23 18-08-2010
vlary



Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
gryu А что мешает обработать это непосредственно в  lme.pl?
Получает имя файла, читает его, формирует новое имя и пишет туда нечто.

Всего записей: 17274 | Зарегистр. 13-06-2007 | Отправлено: 13:14 19-08-2010
gryu



дикий гусь
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
vlary
Вот эту идею мне уже подали.  
Только я перл знаю ещё меньше чем язык шелл.
В смысле lme.pl, это перловый скрипт.  
dekstero4eg
Вчера попробовал ваш код.
"Или что то случилось, или одно из двух"(с)
Не работает.  
Пробовал правда находясь в цейтноте и возможно криво пробовал.

Всего записей: 13025 | Зарегистр. 15-03-2006 | Отправлено: 13:28 19-08-2010 | Исправлено: gryu, 13:43 19-08-2010
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
gryu
скажите, что вообще делается по сути? мб это можно написать проще? лично я понял, что перловый скрипт получает файл содержащий -em модифицирует его и сохраняет новый с допиской -m. Старый файл при этом удаляется или остаётся?

----------
Microsoft gives you windows, linuх gives you the whole house...
I've been using Vim for about 4 years now, mostly because I can't figure out how to exit it.

Всего записей: 6562 | Зарегистр. 28-08-2008 | Отправлено: 14:55 19-08-2010
gryu



дикий гусь
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Alukardd
Цитата:
перловый скрипт получает файл содержащий -em модифицирует его и сохраняет новый с допиской -m.
да.
Старый файл остаётся.  

Цитата:
мб это можно написать проще?
мо би. Но скрипт сложный. Переписывать его, это опять искать людей.  
Более того, сейчас это "рыба". Какой захотел, такой скрипт и поставил, а переписывать, это каждый раз заново.  
 

Всего записей: 13025 | Зарегистр. 15-03-2006 | Отправлено: 16:27 19-08-2010
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
мб поможет элементарное заключение команды в обратные кавычки?
find ./ -type f -name "*-em*" -exec `lme.pl {} > {}-m` \;
 
ну или дописать вывод в {}-m файл непосредственно в perl скрипт...

----------
Microsoft gives you windows, linuх gives you the whole house...
I've been using Vim for about 4 years now, mostly because I can't figure out how to exit it.

Всего записей: 6562 | Зарегистр. 28-08-2008 | Отправлено: 17:03 19-08-2010
dekstero4eg

Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
перловый скрипт получает файл содержащий -em модифицирует его и сохраняет новый с допиской -m.

 
ну тогда ещё проще

Код:
 
[root@mx4 /home/pashkov/scripts]# cat script.sh
#!/usr/local/bin/bash
find ./ -type f -name "*te*" | while read i
do
cp -p $i ${i}-mm
/home/pashkov/scripts/test.sh ${i}-mm
done
 
 

 
 
Добавлено:
До скрипта:
 

Код:
 
[root@mx4 /home/pashkov/scripts]# ls -l
total 8
-rw-r--r--  1 pashkov  wheel    6 18 авг 17:05 rfgh
-rwxr-xr-x  1 pashkov  wheel  184 20 авг 12:07 script.sh
-rwxr-xr-x  1 pashkov  wheel   32 20 авг 12:04 test.sh
-rw-r--r--  1 pashkov  wheel    5 20 авг 12:02 test2
-rw-r--r--  1 root     wheel    0 20 авг 12:02 test3
 

 
После скрипта:

Код:
 
[root@mx4 /home/pashkov/scripts]# ./script.sh
[root@mx4 /home/pashkov/scripts]# ls -l
total 14
-rw-r--r--  1 pashkov  wheel    6 18 авг 17:05 rfgh
-rwxr-xr-x  1 pashkov  wheel  184 20 авг 12:07 script.sh
-rwxr-xr-x  1 pashkov  wheel   32 20 авг 12:04 test.sh
-rwxr-xr-x  1 pashkov  wheel   41 20 авг 12:11 test.sh-mm
-rw-r--r--  1 pashkov  wheel    5 20 авг 12:02 test2
-rw-r--r--  1 pashkov  wheel   14 20 авг 12:11 test2-mm
-rw-r--r--  1 root     wheel    0 20 авг 12:02 test3
-rw-r--r--  1 root     wheel    9 20 авг 12:11 test3-mm
 

 
скрипт test.sh содержит одну строчку:  
echo "modified" >> $1
Как я понял - это аналог вашего перлового скрипта, просто упрощённый

Всего записей: 441 | Зарегистр. 29-06-2009 | Отправлено: 12:09 20-08-2010 | Исправлено: dekstero4eg, 12:33 20-08-2010
gryu



дикий гусь
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
dekstero4eg

Цитата:
#!/usr/local/bin/bash
find ./ -type f -name "*te*" | while read i
do
cp -p $i ${i}-mm
/home/pashkov/scripts/test.sh ${i}-mm
done  

Угу.  
cp -p $i ${i}-mm - лишнее. Скрипт сам всё копирует при запуске test.sh $i > ${i}-mm. Он так написан. Перенаправление, обязательное условие работы.  
Сяб.  
P.S. ну и интерпретатор я использую sh.
 
Добавлено:
Alukardd

Цитата:
б поможет элементарное заключение команды в обратные кавычки?

Не помогает.  
В лучшем случае пишет  
find: lme.pl ./тут_правильные_имена_найденных_файлов > ./тут_тоже_правильные_имена_найденных_файлов-mm: No such file or directory
 Т.е. find отрабатывает правильно,  {} подставляется в оба места и конвейер отрабатывает,  но результата нет.  
Ни как не соображу какой именно ему путь нужен. К чему.
Абсолютные пути писать пробовал

Всего записей: 13025 | Зарегистр. 15-03-2006 | Отправлено: 13:10 20-08-2010
vjunk

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Делаем врапер для lme.pl (называем lmepl.sh):

Код:
 
#!/bin/sh
exec lme.pl "$1" > "$1-m"
 

Запускаем find:

Код:
 
find ./ -type f -name "*-em*" -exec lmepl.sh "{}" \;
 

Всего записей: 303 | Зарегистр. 23-02-2005 | Отправлено: 23:26 26-08-2010
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Народ подскажите вылезает вот такая ошибка:
find: pred.c:1932: launch: Assertion `starting_desc >= 0' failed.
Aborted

Выполняю команду:
# su www-data -c 'find /var/www -type d -exec chmod g+s "{}" \;'
 
# ls -la /var/www  
total 108
drwxr-xr-x 27 root     root     4096 Сен 25 10:08 .
drwxr-xr-x 13 root     root     4096 Сен 17 18:10 ..
drwxrwxr-x  5 www-data www-data 4096 Сен 17 12:02 3311.old
drwxrwxr-x  5 www-data www-data 4096 Сен 17 12:02 algot.ru
. . .

Как права розданы сейчас думаю понятно: на сам /var/www доступ только у root'а, а дальше всему владелец www-data.
 
Причём команда find вылетает даже если я буду её выполнять на какой-нить вложенный каталог, на который у www-data уже полные права и на родителя тоже.
 
p.s. был какой-то баг в 2006-2007 году при отсутсвии прав на чтение в родительском каталоге вылетала такая же ошибка, но у меня всё с этим в порядке и если не выполнять -exec, а выполнить, например -print, то всё отработает без ошибок.
От root'а команда бегает без ошибок.

----------
Microsoft gives you windows, linuх gives you the whole house...
I've been using Vim for about 4 years now, mostly because I can't figure out how to exit it.

Всего записей: 6562 | Зарегистр. 28-08-2008 | Отправлено: 12:13 30-09-2013 | Исправлено: Alukardd, 12:15 30-09-2013
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Alukardd, тыц.

----------
Dmitry Alexandrov <321942@gmail.com> [PGP] [BTC]

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 19:15 30-09-2013
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ASE_DAG
Вай!
# su www-data -c 'cd /var/www/ && find /var/www -type d -exec chmod g+s "{}" \;'
Вот так отработала!!!
Т.е. если у меня команда find будет исполняться в cron файле от пользователя www-data, у которого домашним каталогом назначен /var/www, то всё должно работать правильно? В принципе ближайшей ночью увижу... Лень менять время в кроне...

----------
Microsoft gives you windows, linuх gives you the whole house...
I've been using Vim for about 4 years now, mostly because I can't figure out how to exit it.

Всего записей: 6562 | Зарегистр. 28-08-2008 | Отправлено: 19:25 30-09-2013
Открыть новую тему     Написать ответ в эту тему

Компьютерный форум Ru.Board » Операционные системы » UNIX » Помогите с командой find


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru