Morgen Leute, kann mir bitte mal kurz jemand bei nem "kleinen" rpm-Prob. helfen?!? mit rpm -qp Paket kann ich alle Dateien eines Paketes anführen, mit rpm -qp Paket | grep Datei suche ich mir nun eine benötigte Datei raus mit rpm -qp *.rpm | grep Datei suche ich nun alle rpm's in einem Verzeichnis nach einer Datei! und genau hier ist mein Problem! Nun wird mir zwar angezeigt wenn ein Paket die gesuchte Datei enthält, aber das rpm- Paket in dem die Datei drinnen ist wird nicht angezeigt! Wie kann ich den obigen Aufruf erweitern um auch das Paket angezeigt zu bekommen? Vielen Dank im Vorraus Mike
* Am Mit, 26 Feb 2003 schrieb Michael Messner:
Morgen Leute,
kann mir bitte mal kurz jemand bei nem "kleinen" rpm-Prob. helfen?!?
mit rpm -qp Paket
kann ich alle Dateien eines Paketes anführen,
mit rpm -qp Paket | grep Datei
suche ich mir nun eine benötigte Datei raus
mit rpm -qp *.rpm | grep Datei
suche ich nun alle rpm's in einem Verzeichnis nach einer Datei! und genau hier ist mein Problem!
Nun wird mir zwar angezeigt wenn ein Paket die gesuchte Datei enthält, aber das rpm- Paket in dem die Datei drinnen ist wird nicht angezeigt!
Wie kann ich den obigen Aufruf erweitern um auch das Paket angezeigt zu bekommen?
Wie wäre es mit for i in *.rpm; do if grep Datei $i > /dev/null; then echo "Gefunden in "$i fi done Gruß Christoph -- Christoph Maurer - 52072 Aachen - Tux#194235 mailto:christoph-maurer@gmx.de - http://www.christophmaurer.de Auf der Homepage u.a.: Installation von SuSE 7.0 auf Notebook Acer Travelmate 508 T, Elektrotechnik an der RWTH Aachen
* Am Mit, 26 Feb 2003 schrieb Christoph Maurer:
* Am Mit, 26 Feb 2003 schrieb Michael Messner:
Morgen Leute,
kann mir bitte mal kurz jemand bei nem "kleinen" rpm-Prob. helfen?!?
mit rpm -qp Paket
kann ich alle Dateien eines Paketes anführen,
mit rpm -qp Paket | grep Datei
suche ich mir nun eine benötigte Datei raus
mit rpm -qp *.rpm | grep Datei
suche ich nun alle rpm's in einem Verzeichnis nach einer Datei! und genau hier ist mein Problem!
Nun wird mir zwar angezeigt wenn ein Paket die gesuchte Datei enthält, aber das rpm- Paket in dem die Datei drinnen ist wird nicht angezeigt!
Wie kann ich den obigen Aufruf erweitern um auch das Paket angezeigt zu bekommen?
Wie wäre es mit for i in *.rpm; do if grep Datei $i > /dev/null; then
Sorry, hier muss natürlich if rpm -qpl $i|grep Datei > /dev/null; then stehen, ändert das Prinzip aber nicht.
echo "Gefunden in "$i fi done
Gruß Christoph -- Christoph Maurer - 52072 Aachen - Tux#194235 mailto:christoph-maurer@gmx.de - http://www.christophmaurer.de Auf der Homepage u.a.: Installation von SuSE 7.0 auf Notebook Acer Travelmate 508 T, Elektrotechnik an der RWTH Aachen
Christoph Maurer wrote:
[...] Sorry, hier muss natürlich
if rpm -qpl $i|grep Datei > /dev/null; then
stehen, ändert das Prinzip aber nicht. [...]
Geht auch noch einfacher: for i in *.rpm ; do \ rpm -qpl $i | grep Datei && echo "Datei: $i"; \ done CU, Th. -- Thomas Hertweck, Geophysicist Geophysical Institute, Karlsruhe University (TH)
Also, sprach Thomas Hertweck am Wednesday 26 February 2003 09:19:
Christoph Maurer wrote:
[...] Sorry, hier muss natürlich
if rpm -qpl $i|grep Datei > /dev/null; then
stehen, ändert das Prinzip aber nicht. [...]
Geht auch noch einfacher:
for i in *.rpm ; do \ rpm -qpl $i | grep Datei && echo "Datei: $i"; \ done
CU, Th.
Oder dieses in ein selbsterstelltes Script schreiben (z.B. mit Namen rpm-find): for i in *.rpm; do rpm -qpl --provides $i|grep $1 && echo $i; done ins zu durchsuchende Verzeichnis wechseln u. z.B. eingeben rpm-find <Name> Wüsste aber noch gern, wie man das umschreibt, damit das Script auch rekursiv Unterverzeichnisse durchsucht! Wer weiß Rat? Viele Grüsse Peter
* Am Mit, 26 Feb 2003 schrieb Peter Bergmann:
Also, sprach Thomas Hertweck am Wednesday 26 February 2003 09:19:
Christoph Maurer wrote:
[...] Sorry, hier muss natürlich
if rpm -qpl $i|grep Datei > /dev/null; then
stehen, ändert das Prinzip aber nicht. [...]
Geht auch noch einfacher:
for i in *.rpm ; do \ rpm -qpl $i | grep Datei && echo "Datei: $i"; \ done
CU, Th.
Oder dieses in ein selbsterstelltes Script schreiben (z.B. mit Namen rpm-find):
for i in *.rpm; do rpm -qpl --provides $i|grep $1 && echo $i; done
ins zu durchsuchende Verzeichnis wechseln u. z.B. eingeben
rpm-find <Name>
Wüsste aber noch gern, wie man das umschreibt, damit das Script auch rekursiv Unterverzeichnisse durchsucht! Wer weiß Rat?
for i in `find -name "*.mp3"`;do ... Wenn die Namen Leerzeichen enthalten (bei RPMs eher ungewöhnlich) musst Du noch IFS umbiegen. Gruß Christoph -- Christoph Maurer - 52072 Aachen - Tux#194235 mailto:christoph-maurer@gmx.de - http://www.christophmaurer.de Auf der Homepage u.a.: Installation von SuSE 7.0 auf Notebook Acer Travelmate 508 T, Elektrotechnik an der RWTH Aachen
Also, sprach Christoph Maurer am Wednesday 26 February 2003 18:01:
* Am Mit, 26 Feb 2003 schrieb Peter Bergmann: Oder dieses in ein selbsterstelltes Script schreiben (z.B. mit Namen rpm-find):
for i in *.rpm; do rpm -qpl --provides $i|grep $1 && echo $i; done
ins zu durchsuchende Verzeichnis wechseln u. z.B. eingeben
rpm-find <Name>
Wüsste aber noch gern, wie man das umschreibt, damit das Script auch rekursiv Unterverzeichnisse durchsucht! Wer weiß Rat?
for i in `find -name "*.mp3"`;do ...
Wenn die Namen Leerzeichen enthalten (bei RPMs eher ungewöhnlich) musst Du noch IFS umbiegen.
Gruß
Christoph
Hi nochmal, habe jetzt folgende Version des Scripts beisammen: #!/bin/bash SEARCH=$1 ABS_PATH=`pwd` find $ABS_PATH -name "*.rpm" -exec echo {} \; | while read RPM do rpm -qpl --provides $RPM | grep $SEARCH > /dev/null 2>&1 RET=$? if [ $RET -eq 0 ] then echo "===========================" printf "PACKAGE: \t $RPM \n" printf "COMPONENT: \t $SEARCH \n" printf "INSTALL-PATH: \n" rpm -qpl --provides $RPM | grep $SEARCH fi done Das Script sucht jetzt ab dem aktuellen Verzeichnis abwärts in allen rpm-Paketen nach dem Namen, den man als Parameter übergibt, also wenn das Script z.B. rpmfind heißt: rpmfind <Name> Danke noch für den Tip! Viele Grüsse Peter
* Am Don, 27 Feb 2003 schrieb Peter Bergmann:
#!/bin/bash
SEARCH=$1
ABS_PATH=`pwd`
find $ABS_PATH -name "*.rpm" -exec echo {} \; | while read RPM do
rpm -qpl --provides $RPM | grep $SEARCH > /dev/null 2>&1
RET=$?
if [ $RET -eq 0 ]
Useless use of [ ]! Du weißt, daß Du die drei Zeilen zusammenfassen kannst, indem Du mit if direkt den Rückgabewert des rpm|grep Befehls überprüfst? Gruß Christoph -- Christoph Maurer - 52072 Aachen - Tux#194235 mailto:christoph-maurer@gmx.de - http://www.christophmaurer.de Auf der Homepage u.a.: Installation von SuSE 7.0 auf Notebook Acer Travelmate 508 T, Elektrotechnik an der RWTH Aachen
* Am Don, 27 Feb 2003 schrieb Peter Bergmann:
#!/bin/bash
SEARCH=$1
ABS_PATH=`pwd`
find $ABS_PATH -name "*.rpm" -exec echo {} \; | while read RPM ^^^^^^^^^ ^^^^^^^^^^^^^^^^ Wie wärs einfach mit der man find -> -print Angabe "." fürs aktuelle -exec echo ist mit Kanonen Verzeichnis? auf Spatzen geschossen.
Hallo Christoph, hallo Peter, hallo Leute, wo wir gerade so schön beim Script-Verbessern sind, will ich auch noch eine kräftige Portion Senf dazugeben ;-) Am Freitag, 28. Februar 2003 08:00 schrieb Christoph Maurer: pwd musst Du dafür nicht extra aufrufen ;-)
do
rpm -qpl --provides $RPM | grep $SEARCH > /dev/null 2>&1 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Die Ausgabe dieses Befehls brauchst Du ja später nochmal, von daher wäre RESULT=`rpm -qpl --provides $RPM | grep $SEARCH` anzuraten. (evtl. noch 2>/dev/null einfügen, wenn nötig. Allerdings dürften in diesem Konstrukt IMHO keine Fehlermeldungen auftauchen.)
RET=$?
if [ $RET -eq 0 ]
Useless use of [ ]!
Nicht nur das ;-) IMHO auch Useless use of if ;-) So, ich bastel mal den Rest des Scripts in die Mail rein ;-)
then
echo "===========================" printf "PACKAGE: \t $RPM \n" printf "COMPONENT: \t $SEARCH \n" printf "INSTALL-PATH: \n" rpm -qpl --provides $RPM | grep $SEARCH
fi
Wieso eigentlich printf? Meine Empfehlung: #!/bin/bash SEARCH=$1 find . -name "*.rpm" -print | while read RPM ; do RESULT=`rpm -qpl --provides $RPM | grep $SEARCH` && { \ echo "===========================" echo -e "PACKAGE: \t $RPM" echo -e "COMPONENT: \t $SEARCH" echo -e "INSTALL-PATH:" echo $RESULT } done Gerade getestet - hat sogar den Vorteil, dass der Exitcode des Scripts != 0 ist, wenn nichts passendes gefunden wird ;-) Alternativ kannst Du nach dem done noch die Ausgabe einer Fehlermeldung veranlassen, also done || echo "$SEARCH not found!" >&2 Allerdings dürfte dieses echo immer gutgehen und setzt deshalb den Exitcode wieder auf 0, ist also nicht wirklich gut. Wenn Du eine Fehlermeldung _und_ einen Exitcode != 0 willst, verwende dieses Schnipsel (statt nur "done"): done || { \ EXITCODE=$? echo "$SEARCH not found" exit $EXITCODE } Gruß Christian Boltz PS: Ich bevorzuge das Setzen des Exitcodes. Grund 1: ist scripttechnisch verwertbar ;-) Grund 2: wird in meinem Prompt angezeigt, und zwar rot hinterlegt. (aber nur, wenn != 0) Inhalt meiner $PS1 auf Anfrage ;-) PPS: Falls Du den "Trick" mit && und || nicht kennst, schau mal in man bash nach. Bei Verständnisfragen zu meiner Version des Scripts kannst Du gern nachfragen. -- Error: File not found -- search behind couch? (Y/N)
participants (5)
-
Christian Boltz
-
Christoph Maurer
-
Michael Messner
-
Peter Bergmann
-
Thomas Hertweck