LINUX.ORG.RU

Помогите со скриптом


0

0

Хочу в куче архивов вида "*tar.gz" найти файл по шаблону, примерно так:

whatpkg имя_файла

Что написал:
cat ~/bin/whatpkg

read var; for i in `find /home/ivan/tstpkg -name *.pkg.tar.gz`
do
tar -tzf $i | grep -H $var
done

Пока не заработало.. :-\
Я такое раньше не делал, так что извиняйте, прошу не пинать сильно :)

★★★

echo "Name of pack: " read pckg echo "Dir name [/home/]" read dir

for i in $dir do ls | grep *pckg* done

Этот скрипт покажет имена файлов, которые были заданы по "шаблону".

VirRaa ★★★
()

например вот так:

#!/bin/sh

read var;

TMP=`mktemp -d`
for i in *.pkg.tar.gz; do
tar -tzf "$i" > "$TMP/$i"
grep -H "$var" "$TMP/$i" | cut -d\/ -f4-99
done

rm -r "$TMP"

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

>find /home/ivan/tstpkg -name "*.pkg.tar.gz" -exec tar -tzf {} \;|grep жопа

Александр, спасибо!

Буквально вчера делал именно так. Проблема в том, что в имени файла, по аргументу -H, grep выводит standart input:

~$ find /home/ivan/tstpkg -name '*.pkg.tar.gz' -exec tar -tvf {} \; | grep -H reaper.h
(standard input):-rw-r--r-- root/root 1849 2007-07-07 23:14 usr/include/vte/reaper.h

То есть я не всегда могу догадаться, в каком пакете был reaper.h
В данном случае, это пакет vte:

~$ ls -l /home/ivan/tstpkg/*vte*
-rw-rw-r-- 1 ivan users 990608 2008-01-05 01:30 /home/ivan/tstpkg/vte#0.16.0-1.pkg.tar.gz

А в этом случае:

~$ find /home/ivan/tstpkg -name '*.pkg.tar.gz' -exec tar -tvf {} \; | grep -H files_private.h
(standard input):-rw-r--r-- root/root 23652 2007-07-18 08:12 usr/include/libvcd/files_private.h

~$ ls -l /home/ivan/tstpkg/*libvcd*
ls: cannot access /home/ivan/tstpkg/*libvcd*: No such file or directory

По-этому думаю как передалать сей скрипт на более умный.

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

Вот моя проблема, grep берёт из standard input, и я не знаю, какой это был файл.

~$ tar tzf tstpkg/vlc#0.8.6c-1.pkg.tar.gz | grep -H mediacontrol_structures.h (standard input):usr/include/vlc/mediacontrol_structures.h

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

>vden
Спасибище большое! Думаю..

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

>vden
Спасибо, огромное! Вот что получилось:

eval `grep -e ^PKGMK_PACKAGE_DIR /etc/pkgmk.conf`
cd $PKGMK_PACKAGE_DIR
for i in *.pkg.tar.gz; do
TMP=`mktemp -d`
tar -tzf "$i" > "$TMP/$i"
grep -H "$*" "$TMP/$i" | cut -d\/ -f4-99
rm -r "$TMP"
done

Теперь хочу избавиться от необходимости менять дирректорию..
Ещё раз спасибо!

~$ time whatpkg reap
libpcre#7.2-1.pkg.tar.gz:usr/man/man3/pcreapi.3.gz
linphone#1.1.0-1.pkg.tar.gz:usr/share/gtk-doc/html/mediastreamer/coreapi.html
vte#0.16.0-1.pkg.tar.gz:usr/include/vte/reaper.h


Иван

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

Мне на руки видно медвед наступил:

~$ time whatpkg reap libpcre#7.2-1.pkg.tar.gz:usr/man/man3/pcreapi.3.gz linphone#1.1.0-1.pkg.tar.gz:usr/share/gtk-doc/html/mediastreamer/coreapi.html vte#0.16.0-1.pkg.tar.gz:usr/include/vte/reaper.h

real 0m28.814s user 0m26.018s sys 0m6.232s ivan@Panama:~$ ls /tmp ivan@Panama:~$ ls /tmp ivan@Panama:~$ time whatpkg reap libpcre#7.2-1.pkg.tar.gz:usr/man/man3/pcreapi.3.gz linphone#1.1.0-1.pkg.tar.gz:usr/share/gtk-doc/html/mediastreamer/coreapi.html vte#0.16.0-1.pkg.tar.gz:usr/include/vte/reaper.h

real 0m27.855s user 0m25.542s sys 0m5.288s

Поправил на вот так (как показано было в начале):

#!/bin/bash eval `grep -e ^PKGMK_PACKAGE_DIR /etc/pkgmk.conf` cd $PKGMK_PACKAGE_DIR TMP=`mktemp -d`

for i in *.pkg.tar.gz; do tar -tzf "$i" > "$TMP/$i" grep -H "$*" "$TMP/$i" | cut -d\/ -f4-99 done

rm -r "$TMP"

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

>Буквально вчера делал именно так. Проблема в том, что в имени файла, 
>по аргументу -H, grep выводит standart input:

>~$ find /home/ivan/tstpkg -name '*.pkg.tar.gz' -exec tar -tvf {} \; | grep -H reaper.h
>(standard input):-rw-r--r-- root/root 1849 2007-07-07 23:14 usr/include/vte/reaper.h 

Дык надо было man grep почитать.

find /dir/tstpkg -name '*.pkg.tar.gz' -print0 | xargs -0 -l -I {} sh -c "tar -tf {} | grep -H --label={} reaper.h"

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

Такой теперь:

#!/bin/bash

eval `grep -e ^PKGMK_PACKAGE_DIR /etc/pkgmk.conf`

find $PKGMK_PACKAGE_DIR -name '*.pkg.tar.gz' \
-print0 | xargs -0 -l -I {} sh -c "tar -tf {} | grep -H --label={} $*"

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