Wolfmann
Anmeldungsdatum: 7. Oktober 2018
Beiträge: 320
|
Hallo, ich möchte Dateien, die mit find gesucht werden und anschließen mit grep gefiltert wurden, mit dem cp Befehl weiterverarbeiten.
Also der Befehl lautet: | find . -type f -iname "*.txt" | grep test
|
Und die Dateien, die mir durch diesen Befehl angezeigt werden, sollen mit cp in ein anderes Verzeichnis kopiert werden. Wie stelle ich das am Besten an? Vielen Dank.
|
sebix
Moderator, Webteam
Anmeldungsdatum: 14. April 2009
Beiträge: 5323
|
Wolfmann schrieb: Hallo, ich möchte Dateien, die mit find gesucht werden und anschließen mit grep gefiltert wurden, mit dem cp Befehl weiterverarbeiten.
Also der Befehl lautet: | find . -type f -iname "*.txt" | grep test
|
Und die Dateien, die mir durch diesen Befehl angezeigt werden, sollen mit cp in ein anderes Verzeichnis kopiert werden. Wie stelle ich das am Besten an?
Entweder indem du die Ausgabe mit einer Schleife durchiterierst,
| find . -type f -iname "*.txt" | grep test | while read line; do ... ; done
|
Wobei das nur bei Dateinamen funktioniert, die keine Zeilenumbrueche enthalten, ansonsten lautet das Stichwort -print0 . Oder du kombinierst find und grep in nur einem find-Aufruf und verwendest dann -exec cp ... {} \;
|
dingsbums
Anmeldungsdatum: 13. November 2010
Beiträge: 3532
|
Wie wäre es ohne grep?
find . -type f -iname *test*.txt -exec cp ... {} +
|
seahawk1986
Anmeldungsdatum: 27. Oktober 2006
Beiträge: 11176
Wohnort: München
|
Dafür könnte man z.B. auch xargs einspannen:
| find . -type f -iname "*.txt" -print0 | xargs --null grep -lZ test | xargs --null cp -t /pfad/zum/ziel/
|
|
Wolfmann
(Themenstarter)
Anmeldungsdatum: 7. Oktober 2018
Beiträge: 320
|
Super, ich danke euch für die Hilfe. Mit der Schleife hat das gut funktioniert. Ich werde mir, falls ich mal längere Dateinamen habe, auch die anderen Methoden ansehen und mich ein bisschen mit exec und xargs auseinandersetzen.
|
seahawk1986
Anmeldungsdatum: 27. Oktober 2006
Beiträge: 11176
Wohnort: München
|
Ich glaube ich habe die Aufgabenstellung falsch verstanden, du wolltest vermutlich eher sowas:
| find . -type f -ipath "*test*.txt" -print0 | xargs --null cp -t /pfad/zum/ziel/
|
|
rklm
Projektleitung
Anmeldungsdatum: 16. Oktober 2011
Beiträge: 12801
|
seahawk1986 schrieb: Ich glaube ich habe die Aufgabenstellung falsch verstanden, du wolltest vermutlich eher sowas:
| find . -type f -ipath "*test*.txt" -print0 | xargs --null cp -t /pfad/zum/ziel/
|
Dann ist es ohne xargs aber einfacher: | find -type f -ipath '*test*.txt' -exec cp -t /pfad/zum/ziel/ {} +
|
|
sebix
Moderator, Webteam
Anmeldungsdatum: 14. April 2009
Beiträge: 5323
|
seahawk1986 schrieb: Ich glaube ich habe die Aufgabenstellung falsch verstanden, du wolltest vermutlich eher sowas:
| find . -type f -ipath "*test*.txt" -print0 | xargs --null cp -t /pfad/zum/ziel/
|
Geht nur, wenn das Ziel immer das gleiche Verzeichnis ist, was wir hier nicht wissen (oder ich habs ueberlesen).
|
Wolfmann
(Themenstarter)
Anmeldungsdatum: 7. Oktober 2018
Beiträge: 320
|
sebix schrieb: seahawk1986 schrieb: Ich glaube ich habe die Aufgabenstellung falsch verstanden, du wolltest vermutlich eher sowas:
| find . -type f -ipath "*test*.txt" -print0 | xargs --null cp -t /pfad/zum/ziel/
|
Geht nur, wenn das Ziel immer das gleiche Verzeichnis ist, was wir hier nicht wissen (oder ich habs ueberlesen).
Ja, ich bin davon ausgegangen, dass das Zielverzeichnis immer gleich ist. Das Skript kann ja von sich aus das Verzeichnis schlecht ändern oder verstehe ich da was falsch?
|
seahawk1986
Anmeldungsdatum: 27. Oktober 2006
Beiträge: 11176
Wohnort: München
|
Ich hatte das initial so verstanden, dass du nach "test" in den Dateien suchen willst, nicht im Pfad der Dateien (was man mit -ipath statt -iname machen kann).
|
Wolfmann
(Themenstarter)
Anmeldungsdatum: 7. Oktober 2018
Beiträge: 320
|
seahawk1986 schrieb: Ich hatte das initial so verstanden, dass du nach "test" in den Dateien suchen willst, nicht im Pfad der Dateien (was man mit -ipath statt -iname machen kann).
Also der Dateiname sollte test enthalten, z.B. test1.txt; testdatei usw... -ipath sucht dann die entsprechenden Zeichenketten im Pfad, also z.B. /home/testverzeichnis, oder?
|
seahawk1986
Anmeldungsdatum: 27. Oktober 2006
Beiträge: 11176
Wohnort: München
|
Wolfmann schrieb: seahawk1986 schrieb: Ich hatte das initial so verstanden, dass du nach "test" in den Dateien suchen willst, nicht im Pfad der Dateien (was man mit -ipath statt -iname machen kann).
Also der Dateiname sollte test enthalten, z.B. test1.txt; testdatei usw...
Dafür reicht eigentlich -iname="*test*.txt"
-ipath sucht dann die entsprechenden Zeichenketten im Pfad, also z.B. /home/testverzeichnis, oder?
Genau, das matcht ohne Rücksicht auf Groß- und Kleinschreibung auf den Pfad der gefunden Dateien, das umfasst sowohl Verzeichnisse als auch Dateinamen.
|