GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Linux, warum kann ich find result nicht an rm weiterleiten?

Um die Antwort von @Alex Gitelman zu erweitern:Ja, es gibt einen Unterschied zwischen "Standardeingabe" und der Befehlszeile.

Wenn Sie rm a.txt b.txt c.txt eingeben , die Dateien, die Sie nach rm auflisten werden als Argumente bezeichnet und werden rm durch eine spezielle Variable (genannt argv) zur Verfügung gestellt im Inneren). Die Standardeingabe dagegen sieht für ein Unix-Programm wie eine Datei namens stdin aus . Ein Programm kann Daten aus dieser "Datei" so lesen, als ob es eine normale Datei auf der Festplatte öffnen und daraus lesen würde.

rm , wie viele andere Programme, nimmt seine Argumente von der Befehlszeile, ignoriert aber die Standardeingabe. Sie können alles daran leiten, was Sie möchten; Es wird diese Daten einfach wegwerfen. Dort steht xargs ist praktisch. Es liest Zeilen auf der Standardeingabe und wandelt sie in Befehlszeilenargumente um, sodass Sie Daten effektiv an die Befehlszeile eines anderen Programms weiterleiten können. Das ist ein netter Trick.

Zum Beispiel:

find . -name ".txt" | xargs rm
find . -name ".txt" | grep "foo" | xargs rm  

Beachten Sie, dass dies nicht korrekt funktioniert, wenn Dateinamen Zeilenumbrüche oder Leerzeichen enthalten. Um mit Dateinamen umzugehen, die Zeilenumbrüche oder Leerzeichen enthalten, sollten Sie stattdessen Folgendes verwenden:

find . -name ".txt" -print0 | xargs -0 rm

Dies teilt find mit um die Ergebnisse mit einem Nullzeichen anstelle eines Zeilenumbruchs abzuschließen. Allerdings grep wird dann nicht mehr so ​​funktionieren wie vorher. Verwenden Sie stattdessen Folgendes:

find . -name ".txt" | grep "foo" | tr "\n" "\0" | xargs -0 rm

Diesmal tr wird verwendet, um alle Zeilenumbrüche in Nullzeichen umzuwandeln.


"Warum kann ich find result nicht an rm weiterleiten?"

Wenn Sie etwas an ein Programm leiten, ersetzt die Pipe die Tastatureingabe. Denken Sie daran und stellen Sie sich die nächste Frage:Was wäre rm mit einer Tastatur machen? Löschen Sie Ihre Tastenanschläge? (in der Tat ein bisschen albern) Interaktive Steuerung akzeptieren? (rm ist nicht interaktiv, außer manchmal, wenn es eine Bestätigung braucht, die tatsächlich durch eine Pipe gegeben werden kann.)

In der Tat, wenn rm bereits ausgeführt wird, können Sie keine Befehle eingeben, um Dateien löschen zu lassen ... also können Sie das auch nicht mit einer Pipe tun.

Wenn Sie bedenken, dass eine Pipe die Tastatur/Bildschirm-Kombination ersetzt, erscheint die Sache sofort logischer.

Jetzt umgekehrt. Sie können einen Datenstrom in grep leiten .Bedeutet das, dass Sie grep stattdessen die Tastenanschläge von Ihrer Tastatur als Eingabedaten lesen lassen können?

JAWOHL! Das ist eigentlich das, was es nativ (ohne Rohrleitungen) tut.

(Beachten Sie übrigens, dass Sie das Suchargument nicht in grep leiten oder eingeben können )

Jetzt wissen Sie also, warum Sie nicht können Leitung zu rm und erwarten, dass es als Kommandozeilenargument funktioniert.

tl;dr :

Anatomie eines Programms gemäß der UNIX-Philosophie:
Datei ein, Datei aus, Tastatur ein, Bildschirm aus. -> Pipe ersetzt nur Tastatur und Bildschirm.


Pipe sendet die Ausgabe des ersten Befehls an die Standardeingabe des zweiten. rm akzeptiert keine Standardeingabe, also können Sie nicht dorthin leiten. Sie könnten xargs verwenden um den gleichen Effekt zu erzielen. Sie können ein Beispiel für xargs finden speziell für Ihren Fall in der Manpage für xargs.


Linux
  1. Linux-Suchbefehle

  2. Finden Sie Befehlsbeispiele in Linux

  3. Wie füge ich eine Pipe | ein in meinem Linux find -exec Befehl?

  4. Wie man die Ergebnisse von 'find' unter Linux an mv weiterleitet

  5. Kann ich Dota 2 unter Linux spielen?

So finden Sie Dateien unter Linux

Finden Sie große Dateien in Linux

So finden Sie die IP-Adresse unter Linux

So finden Sie den Hostnamen unter Linux

Wo finde ich die erste Version des Linux-Betriebssystems?

Warum funktioniert diese Regex nicht unter Linux?