ausgabe von find1 zu find2 übergeben

dosenfleisch

dosenfleisch

Foren As
hallo,

ich möchte in dir a dateien finden, die schon einige tage nicht mehr modifiziert wurden. habe ich diese gefunden, möchte ich in dir b die unterverzeichnisse scannen, in denen sich eine datei befindet, die den dateinamen aus dir a enthält.
habe ich das richtige unterverzeichnis mit dieser datei gefunden, soll das unterverzeichnis gelöscht werden.

geschafft habe ich bisher:
ich finde 5 tage alte dateien mit
Code:
find /media/hda3/dira -maxdepth 1 -type f -mtime +5 -exec echo {} \
und ich finde im verzeichnis b dateien, die einen bestimmten string enthalten
Code:
find /media/hda3/dirb/textfile -print | xargs grep -l teststring
nun schaffe ich es aber nicht, beides miteinander zu verbinden.
also der bei find 1 gefundene dateiname soll bei find 2 der zu suchende string sein.

mit welchem befehl macht man das?

und wie ermittle ich das verzeichnis, in dem sich diese datei befindet, sodaß ich es löschen kann? mit pwd vielleicht?
 
Hi,

hallo,
...
nun schaffe ich es aber nicht, beides miteinander zu verbinden.
also der bei find 1 gefundene dateiname soll bei find 2 der zu suchende string sein.

mit welchem befehl macht man das?

und wie ermittle ich das verzeichnis, in dem sich diese datei befindet, sodaß ich es löschen kann? mit pwd vielleicht?

Grundsätzlich: Wenn Du beides miteinander "verbinden" möchtest, geht das am besten indem Du sie untereinander verschachtelst, so daß der 2. Befehl jede einzelne Ausgabe des 1. Befehls zur Bearbeitung übergeben bekommt:
Code:
find /media/hda3/dira -maxdepth 1 -type f -mtime +5 [i][b]-exec echo {} \;[/b][/i] | \
 while read zeile; do
 find /media/hda3/dirb/textfile -print | xargs grep -l $zeile
done

Das "-exec echo {} \;" ist überflüssig, da find ohne -exec sowieso die zutreffenden Dateien ausgibt.



Code:
find /media/hda3/dirb/textfile -print | xargs grep -l teststring
erscheint mir hier etwas umständlich. Das läßt sich auch mit grep alleine machen (ich nehme mal an, Du willst 'dirb' durchsuchen lassen, und nicht nur 'textfile'):
Code:
grep -R teststring /media/hda3/dirb/*



Letztendlich würde ich Dir für Dein Vorhaben folgendes vorschlagen:
Code:
find /media/hda3/dira -maxdepth 1 -type f -mtime +5 -exec grep -RH "{}" /media/hda3/dirb/* \;
Das durchsucht den Inhalt aller Dateien in .../dirb rekursiv nach dem Vorkommen des vollen Pfades (z. B. "/media/hda3/dira/meinedatei")
Möchtest Du nur nach dem Dateinamen suchen lassen, würde ich es so machen:
Code:
find /media/hda3/dira -maxdepth 1 -type f -mtime +5 -printf "%f\n" | \
 while read dateiname; do
 grep -R "$dateiname" /media/hda3/dirb/*
done

Gruß Daniel
 
Zuletzt bearbeitet:
ich danke dir sehr für deine hilfe.
eines habe ich aber noch:

grep findet die richtigen dateien (letztes bsp von dir) wirft mir aber folgendes aus:

Code:
Übereinstimmungen in Binärdatei /media/hda3/dirb/dirf/textfile.
Übereinstimmungen in Binärdatei /media/hda3/dirb/dirg/textfile.
Übereinstimmungen in Binärdatei /media/hda3/dirb/dirt/textfile.

nun versuche ich seit stunden mit google herauszufinden, wie ich mit expr oder sed an diesen dateinamen komme. ich kriege es einfach nicht gebacken.

weißt du auch da noch rat?

Edit: genau genommen brauche ich den ordner, in dem sich das textfile befindet (unterhalb von dirb) um ihn zu löschen, aber wenn ich den dateinamen habe, kann ich auch nur diese löschen, was ersteinmal genügen würde.
 
Zuletzt bearbeitet:
Etwa sowas:
Code:
grep -R teststring /media/hda3/dirb/* | cut -d' ' -f4 | xargs dirname
Gruss
d22
 
Hi,

Dizzgo hat Dir zum herausschneiden des Pfades aus der grep-Ausgabe schon ein Beispiel gegeben.
Du kannst Dir das Ganze aber auch sparen, wenn Du grep noch die Option -l mitgibst:
Code:
 grep -l -R "$dateiname" /media/hda3/dirb/*
Damit werden Dir nur die zutreffenden Dateipfade ausgegeben.


Code:
 dirname $(grep -l -R "$dateiname" /media/hda3/dirb/*)
würde Dir dann nur das entsprechende Verzeichnis zu dem herausgefundenen Dateipfad ausgeben.

Nur nochmal zum Verständnis: Möchtest Du Dateien ausfindig machen, die in 'dira' vorkommen, max. 5 Tage alt sind und deren Namen im Inhalt bestimmter (Text-)Dateien aus 'dirb' vorkommen oder nur herausfinden, welche Dateien sowohl in 'dira' als auch in 'dirb' vorkommen, um diese dann aus 'dirb' zu löschen?

Ich hatte Dein
und ich finde im verzeichnis b dateien, die einen bestimmten string enthalten
...
also der bei find 1 gefundene dateiname soll bei find 2 der zu suchende string sein.
auf den Inhalt bezogen verstanden. Aber ich vermute jetzt, daß Du eher den Dateinamen damit meintest:

Code:
find /media/hda3/dira -maxdepth 1 -type f -mtime +5 -printf "%f\n" | \
 while read dateiname; do
 find -name "$dateiname" /media/hda3/dirb/ | \
  while read doppelgefunden; do
  rm -v "$doppelgefunden"
  rmdir $(dirname "$doppelgefunden") 2>/dev/null && echo "Leeres Verzeichnis von '$doppelgefunden' geloescht."
 done
done
Ich denke im Großen und Ganzen sind die Vorgänge hier verständlich - falls nicht: manpages lesen ;-) oder notfalls nachfragen.

Gruß Daniel
 
Zuletzt bearbeitet:
Code:
grep -R teststring /media/hda3/dirb/* | cut -d' ' -f4 | xargs dirname

bitte, wie heißt denn das äquivalent zu "xargs dirname", wenn ich den dateinamen suche?

mit folgendem code bleibt leider ein punkt nach dem dateinamen übrig.
Code:
grep -R teststring /media/hda3/dirb/* | cut -d' ' -f4

danke für eure hilfe!
 
Code:
grep -R teststring /media/hda3/dirb/* | cut -d' ' -f4 | basename $datei .

so dann wohl.
vielen dank!
 

Ähnliche Themen

find Ausgabe in "Anführungszeichen"

Problem mit HSPA+ Modem Huawei E353 - Installation unmöglich?

Mehrere Verzeichnisse nach best. Dateien/Verz. durchsuchen

rsync: Quelle größer als Ziel => "Archiv" aufteilen/splitten

zwei Verzeichnisse bidirektional vergleichen

Zurück
Oben