Linux-Befehl: Dateien suchen und Befehl ausführen

16

Wie schaffe ich es, alle Dateien in einem Verzeichnis und in Unterverzeichnissen zu finden und einen Befehl darauf auszuführen?

Zum Beispiel,

find . -type f -name "*.txt" 

findet alle txt-Dateien und:

find . -type f -name "*.txt" | gedit

sendet es an gedit, aber in einer Textdatei. Ich möchte, dass gedit alle Textdateien öffnet.

xyz
quelle

Antworten:

22

Mit dem -execFlag können Sie einen Befehl für jede übereinstimmende Datei ausführen:

$ find ./ -type f -name "*.txt" -exec gedit "{}" \;

Syntax

Die Syntax ist etwas seltsam (siehe -exec command ;auf den Manpages für mehr):

The string `{}' is replaced by the current file name being processed

Möglicherweise möchten Sie auch berücksichtigen -execdir, was dasselbe tut, aber den Befehl aus dem Unterverzeichnis ausführt, das die übereinstimmende Datei enthält (dies ist im Allgemeinen vorzuziehen).

David Cain
quelle
1
Vielen Dank. Ich sehe, dass es funktioniert. Aber was bedeutet das Ende ("{}" \ :)? Liste ausführen?
1
Das {}steht für den aktuellen Dateinamen und das Semikolon beendet gerade den Befehl. Der Backslash und die umgebenden Anführungszeichen sollen lediglich die Shell-Erweiterung verhindern.
David Cain
5

find . -type f -name "*.txt" -print0 | xargs -0 gedit

Notinlist
quelle
Vielen Dank. Ich sehe, dass es funktioniert. Aber was macht der -print0 | xargs -0 Teil bedeutet?
1
@xyz, Sie können über die Flags jedes UNIX-Befehls lesen . Versuchen Sie man findoder man xargs, /um nach einer bestimmten Flagge zu suchen. Die Dokumentation ist recht gut, sie sollte Ihre Fragen beantworten.
David Cain
1
-print0Gibt nach jedem Eintrag ein NULL-Zeichen aus und -0erwartet , dass die Einträge durch ein NULL-Zeichen getrennt werden. Dies ist der sicherste Weg, mit kniffligen Namen umzugehen.
Notinlist
Und ist es nicht ein bisschen seltsam, dass die Syntax nicht gedit xargs -0 statt xargs -0 gedit ist? Ich sehe, dass Ersteres nicht funktioniert, verstehe aber nicht warum.
3
xargs ist aus Leistungsgründen -exec vorzuziehen, da xargs eine Reihe von Argumenten "stapeln" kann, bevor sie an gedit übergeben werden. Wenn Sie gedit für jede Datei einzeln ausführen müssen, ersetzen Sie '... -print0 | xargs -0 gedit 'mit' ... -print0 | xargs -0 -i gedit {} 'xargs ist einer dieser Befehle wie find und screen, mit denen Sie nie wissen, wie Sie ohne ein Jahr, nachdem Sie davon erfahren haben, zurechtgekommen sind.
Arclight