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.

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).


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


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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.