Wie schreibe ich die Ausgaben von find in eine Datei?

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
mino23
Beiträge: 64
Registriert: 15.07.2019 18:49:51

Wie schreibe ich die Ausgaben von find in eine Datei?

Beitrag von mino23 » 25.03.2022 16:30:04

Code: Alles auswählen

cd bla
find . -maxdepth 4 -mindepth 4 -type f \( -name '*.htm' -or -name '*.html' \) | grep -v page | tee pipe2.txt
Bei mir wird alles auf den Bildschirm ausgeworfen. Meine Versuche mit einer Datei ergaben immer eine leere Datei.

Das grep -v page soll Unterverzeichnisse mit dem Namen page ausschließen. Meine Versuche das via find zu erledigen sind gescheitert. find erwartet immer den vollen Pfadnamen. Den kann ich leider nicht mitliefern, weil es hier um ein Wordpress Archiv handelt und das hat die feste Struktur von ../2007/12/14 also Jahr Monat Tag.

Ich möchte das find bzw. grep seine Ausgaben in eine Datei schreibt. Kann mir jemand helfen?

JTH
Moderator
Beiträge: 3023
Registriert: 13.08.2008 17:01:41
Wohnort: Berlin

Re: Wie schreibe ich die Ausgaben von find in eine Datei?

Beitrag von JTH » 25.03.2022 16:42:51

Das ist eigentlich schon ein möglicher Ansatz. tee schreibt die Zeilen sowohl auf den Bildschirm, als auch in die angegebene Datei pipe2.txt
Manchmal bekannt als Just (another) Terminal Hacker.

mino23
Beiträge: 64
Registriert: 15.07.2019 18:49:51

Re: Wie schreibe ich die Ausgaben von find in eine Datei?

Beitrag von mino23 » 25.03.2022 17:22:22

Ja, dachte ich auch. Also wenn ich tee pipe2.txt auf tee /home/user/pipe2.txt ändere, dann wird die Datei geschrieben, ansonsten nicht. Denke das hängt mit dem find . zusammen. Der Punkt bringt find durcheinander, denke ich, siehe auch grep -v.

JTH
Moderator
Beiträge: 3023
Registriert: 13.08.2008 17:01:41
Wohnort: Berlin

Re: Wie schreibe ich die Ausgaben von find in eine Datei?

Beitrag von JTH » 25.03.2022 17:52:31

Nein, der Punkt an sich wird nicht der Fehler sein. Es liegt dann, so wie du es beschreibst, eher daran, dass du versuchst, die Datei in einen Ordner zu schreiben, in dem der Benutzer, mit dem du das find aufrufst, gar nicht schreiben darf.

Du schreibst oben etwas von Wordpress – versuchst du das Ganze in /var/www auszuführen und das als dein „normaler“, unprivilegierter Benutzer?

Du kannst den Punkt beim find-Aufruf auch einfach durch den Ordner ersetzen, den du durchsuchen willst. Beispiel:

Code: Alles auswählen

find /bla/bla/bla -maxdepth 4 -mindepth 4 -type f \( -name '*.htm' -or -name '*.html' \) | grep -v page | tee pipe2.txt
Und wenn du ähnlich hinten beim tee die Datei ohne Pfad angibst, wird sie in den aktuellen Ordner geschrieben. Das war in deinem ersten Beispiel der Ordner bla.
Manchmal bekannt als Just (another) Terminal Hacker.

eggy
Beiträge: 3331
Registriert: 10.05.2008 11:23:50

Re: Wie schreibe ich die Ausgaben von find in eine Datei?

Beitrag von eggy » 25.03.2022 19:51:36

Ohne mich in den Rest der Diskussion einmischen zu wollen, nur ne kleine Anmerkung: "grep -v page" ist vermutlich nicht, was Du haben willst. Warum? page.html würde ebenso ausgeschlossen werden wie Papagei.html

tobo
Beiträge: 1991
Registriert: 10.12.2008 10:51:41

Re: Wie schreibe ich die Ausgaben von find in eine Datei?

Beitrag von tobo » 25.03.2022 20:24:24

Ohne separates grep:

Code: Alles auswählen

find ... -not -path '*/page/*' ...

Benutzeravatar
ralli
Beiträge: 3919
Registriert: 02.03.2008 08:03:02

Re: Wie schreibe ich die Ausgaben von find in eine Datei?

Beitrag von ralli » 26.03.2022 17:13:55

Bei mir funktioniert

Code: Alles auswählen

find / -name *.png > ergebnis -print
als root einwandfrei. In der Datei Ergebnis stehen dann alle gefunden png Dateien.

Gruß ralli
Wer nicht lieben kann, muß hassen. Wer nicht aufbauen kann muß zerstören. Wer keine Brücken baut, muß spalten.

Benutzeravatar
MSfree
Beiträge: 10773
Registriert: 25.09.2007 19:59:30

Re: Wie schreibe ich die Ausgaben von find in eine Datei?

Beitrag von MSfree » 26.03.2022 17:43:19

ralli hat geschrieben: ↑ zum Beitrag ↑
26.03.2022 17:13:55
Bei mir funktioniert

Code: Alles auswählen

find / -name *.png > ergebnis -print
als root einwandfrei.
Da gebe ich zu bedenken, daß man Platzhalter wie das Sternchen immer zu "escapen" bzw. in Hochkommas zu stellen sind.

Wenn du folgendes aufrufst:

Code: Alles auswählen

touch blubber.png
find / -name *.png
wirst du auch als root nur eine einzige PNG-Datei finden, nämlich blubber.png. Die Shell ersetzt nämlich den Platzhalter dann mit der gereade erzeugten Datei und würde dann nur noch nach blubber.png suchen, mit sehr geringer Wahrscheinlichkeit, eine weitere Datei mit diesem Namen zu finden.

Ausserdem ist das "-print" am Ende der Zeile wirkungslos. Mich wundert, daß es da keine Fehelrmeldung gibt. Wenn du schon "-print" angibst, dann muß es vor dem Umleitungsoperator ">" passieren. find kommt aber auch ohne "-print" aus.

Richtig wäre also eine der folgenden Varianten:

Code: Alles auswählen

find / -name \*.png > ergebnis
find / -name "*.png" > ergebnis
find / -name \*.png -print > ergebnis
find / -name "*.png" -print > ergebnis

JTH
Moderator
Beiträge: 3023
Registriert: 13.08.2008 17:01:41
Wohnort: Berlin

Re: Wie schreibe ich die Ausgaben von find in eine Datei?

Beitrag von JTH » 26.03.2022 18:01:11

MSfree hat geschrieben: ↑ zum Beitrag ↑
26.03.2022 17:43:19
Ausserdem ist das "-print" am Ende der Zeile wirkungslos. Mich wundert, daß es da keine Fehelrmeldung gibt. Wenn du schon "-print" angibst, dann muß es vor dem Umleitungsoperator ">" passieren.
Nope, das -print ist dort nicht wirkungslos und kann auch keine Fehlermeldung geben. Die Ein-/Ausgabeumleitungen können nämlich – zumindest in diesem „einfachen“ Fall – an beliebiger Stelle in der Kommandozeile auftauchen:
man bash hat geschrieben: The following redirection operators [< und >] may precede or appear anywhere within a simple command or may follow a command.

„Richtig“ sind, wenn man es so nennen möchte, und funktionieren tun damit tatsächlich alle folgenden Varianten, das -print zum Kürzen mal weggelassen:

Code: Alles auswählen

find / -name '*.png' >ergebnis
find / -name >ergebnis '*.png'
find / >ergebnis -name '*.png'
find >ergebnis / -name '*.png'
>ergebnis find / -name '*.png'
Da das aber sicherlich eher unbekannt ist und für Verwirrung sorgt, sollte man die Umleitungen wohl immer ans Ende stellen.
Manchmal bekannt als Just (another) Terminal Hacker.

tobo
Beiträge: 1991
Registriert: 10.12.2008 10:51:41

Re: Wie schreibe ich die Ausgaben von find in eine Datei?

Beitrag von tobo » 26.03.2022 19:14:51

MSfree hat geschrieben: ↑ zum Beitrag ↑
26.03.2022 17:43:19
Wenn du folgendes aufrufst:

Code: Alles auswählen

touch blubber.png
find / -name *.png
wirst du auch als root nur eine einzige PNG-Datei finden, nämlich blubber.png. Die Shell ersetzt nämlich den Platzhalter dann mit der gereade erzeugten Datei und würde dann nur noch nach blubber.png suchen, mit sehr geringer Wahrscheinlichkeit, eine weitere Datei mit diesem Namen zu finden.
Es ist zwar richtig zu quoten, aber die Erklärung ist falsch. Die Shell ersetzt nämlich den Platzhalter mit allen gefunden *.png-Dateien im Arbeitsverzeichnis. Wenn da nur eine ist, dann geht folgender Aufruf an find:

Code: Alles auswählen

touch blubber.png
find / -name blubber.png
Heißt, finde blubber.png. Gibt's mehrere *.png im Verzeichnis, dann geht folgender Aufruf an find:

Code: Alles auswählen

touch blubber.png
find / -name blubber.png blubber2.png blubber3.png blubber4.png
Und das ergibt dann einen Fehler, da -name nur ein Muster mitbringen kann

JTH
Moderator
Beiträge: 3023
Registriert: 13.08.2008 17:01:41
Wohnort: Berlin

Re: Wie schreibe ich die Ausgaben von find in eine Datei?

Beitrag von JTH » 26.03.2022 19:24:15

tobo hat geschrieben: ↑ zum Beitrag ↑
26.03.2022 19:14:51
Es ist zwar richtig zu quoten, aber die Erklärung ist falsch. Die Shell ersetzt nämlich den Platzhalter mit allen gefunden *.png-Dateien im Arbeitsverzeichnis.
Damit ist MSfrees Erklärung aber doch nicht falsch, sondern höchstens unvollständig, oder? Er hat zwar das Problem bei mehreren zutreffenden Dateien nicht beschrieben, aber eine Begründung für das Quoten ist auch der Fall mit einer Datei.
Manchmal bekannt als Just (another) Terminal Hacker.

tobo
Beiträge: 1991
Registriert: 10.12.2008 10:51:41

Re: Wie schreibe ich die Ausgaben von find in eine Datei?

Beitrag von tobo » 26.03.2022 19:36:57

Meiner Meinung nach hat "die gerade erzeugte Datei" in der Erklärung nichts zu suchen, auch wenn die Schnittmenge aus "die gerade erzeugte Datei" und "alle gefunden *.png-Dateien im Arbeitsverzeichnis" zufälligerweise gerade übereinstimmt. Da lassen sich ja noch ganz andere Konstrukte hinschreiben, die zufälligerweise auch gerade passen könnten (z.B. wenn man nach allen Dateien mit 0 Byte Dateigröße sucht).

Antworten