Wie verwende ich den Befehl "cat" für die Ausgabe des Befehls "find"?

13

Ich möchte die Ausgabe des findBefehls auf catBefehl umleiten , damit ich die Daten der angegebenen Datei drucken kann.

Wenn zum Beispiel die Ausgabe von find ist, sollte /aFile/readmedie Katze als interpretiert werden cat ./aFile/readme. Wie kann ich das sofort tun?

Muss ich Rohre verwenden?

Ich habe Versionen davon ausprobiert:

cat | find ./inhere -size 1033c 2> /dev/null

Aber ich denke das ist völlig falsch? Natürlich bin ich mir sicher, dass die Ausgabe nur eine Datei und nicht mehrere Dateien ist.

Wie kann ich das machen? Ich habe bei Google gesucht und keine Lösung gefunden, wahrscheinlich weil ich nicht richtig gesucht habe: P.

Eksapsy
quelle

Antworten:

20

Sie können dies findalleine tun, indem Sie die folgende -execAktion ausführen:

find /location -size 1033c -exec cat {} +

{}wird auf die gefundenen Dateien erweitert und +ermöglicht es uns, so viele Argumente wie möglich pro Aufruf von zu lesen cat, da cat mehrere Argumente annehmen kann.

Wenn Sie finddie +Erweiterung nicht haben oder die Dateien einzeln lesen möchten:

find /location -size 1033c -exec cat {} \;

Wenn Sie Optionen von verwenden möchten, gehen Sie wie folgt vor cat:

find /location -size 1033c -exec cat -n {} +
find /location -size 1033c -exec cat -n {} \;

Hier benutze ich die -nOption, um die Zeilennummern zu erhalten.

heemayl
quelle
Also, wenn ich richtig bin: {} ist wie eine Variable, in der die Ausgabe des Befehls find gespeichert ist und nach dem "+" - Zeichen sollen Sie die cat-Parameter schreiben? Nein ? Bearbeiten: Okay, Sie haben Ihren Beitrag bearbeitet und jetzt haben Sie gerade meine Frage beantwortet: P Danke Mann! Gelöst!
Eksapsy
@ General656 Überprüfen Sie meine Änderungen ..
Heemayl
1
Die Tatsache, dass ich nichts über catdie -nOption wusste , überrascht mich. Ich liebe es, zufällige Fragen zu lesen.
Mazunki
0

Befehlsersetzung

Eine andere Option ist die Verwendung der Befehlssubstitution . Wenn Sie einen Befehl einschließen, $()wird der Befehl ausgeführt und der Befehl durch seine Ausgabe ersetzt.

cat $(find ./inhere -size 1033c 2> /dev/null)

wird werden

cat ./inhere/file1 .inhere/file3

Dies entspricht mehr oder weniger der Verwendung des älteren Stils zum Umschließen von Befehlen mit Back Ticks:

cat `find ./inhere -size 1033c 2> /dev/null`

Weitere Details finden Sie in den oben verlinkten Dokumenten

Bash führt die Erweiterung durch, indem der Befehl in einer Subshell-Umgebung ausgeführt und die Befehlsersetzung durch die Standardausgabe des Befehls ersetzt wird, wobei alle nachfolgenden Zeilenumbrüche gelöscht werden. Eingebettete Zeilenumbrüche werden nicht gelöscht, können jedoch während der Wortteilung entfernt werden. Die Befehlsersetzung $(cat file)kann durch die entsprechende ersetzt werden, jedoch schneller $(< file).

Wenn die alten Stil Backquote Form der Substitution verwendet wird, behält Backslash seine wörtliche Bedeutung , außer wenn gefolgt von $, `oder \. Das erste Backquote, dem kein Backslash vorangestellt ist, beendet die Befehlsersetzung. Bei Verwendung des $(command)Formulars bilden alle Zeichen zwischen den Klammern den Befehl. keine werden speziell behandelt.

Befehlsersetzungen können verschachtelt sein. Um bei Verwendung des Formulars mit Anführungszeichen zu verschachteln, müssen Sie die inneren Anführungszeichen mit umgekehrten Schrägstrichen maskieren.

Wenn die Ersetzung in doppelten Anführungszeichen angezeigt wird, werden für die Ergebnisse keine Wortaufteilung und Dateinamenerweiterung durchgeführt.

In dieser anderen Antwort finden Sie einige gute Anwendungsbeispiele.

WhiteHotLoveTiger
quelle
Beachten Sie, dass beim findAuffinden zu vieler Dateien ein Fehler "Argumentliste zu lang" generiert wird, der beim Aufrufen versucht wird cat. Es würde auch Probleme beim Umgang mit Dateinamen geben, die Leerzeichen enthalten, und möglicherweise auch mit Dateinamen, die Dateinamen-Globbing-Zeichen enthalten.
Kusalananda
-1

Dadurch werden Name und Inhalt von Textdateien (ASCII) nur rekursiv gedruckt.

find . -type f -exec grep -Iq . {} \; -print | xargs awk 'FNR==1{print FILENAME ":" $0; }'

Noch ein Versuch

find . -type f -exec grep -Iq . {} \; -printf "\n%p:" -exec cat {} \;
Prashant Adlinge
quelle
-2

Verwenden Sie Pipe und Xargs

find /* -name pg_hba.conf | xargs cat

Wenn dies aufgrund fehlender Berechtigungen fehlschlägt, können Sie mit sudo sicherstellen, dass Sie über die Berechtigung zum Ausführen des Befehls find in dem von Ihnen gesuchten Verzeichnis verfügen.

 sudo find /* -name pg_hba.conf | xargs sudo cat
App Arbeit
quelle
1
Und wenn jemand eine Datei mit dem Namen erstellt /tmp/ /dev/urandom /pg_hba.confhat, kann root den gesamten Inhalt von /dev/urandom. Schlimmer kann wahrscheinlich je nach Kontext getan werden. xargssollte fast nie ohne oder gar nicht verwendet werden -0. Wäre sudo xargsauch besser als xargs sudo. Und /*wäre besser als /.
Stéphane Chazelas
1
Das OP möchte cat verwenden, um den Dateiinhalt auf stdout zu drucken. Der Zweck wird also von Katze erfüllt. Die Frage ist, wie man cat aus dem Befehl out put of find verwendet, um den Inhalt der Datei zu drucken, nicht wie man sudo oder find verwendet. Der obige Befehl löst die Frage. Ja, xargs -0 war die einzige konstruktive Sache, auf die Sie hingewiesen haben. Aber nicht die Verwendung gezeigt. Versuche nicht unhöflich zu sein.
App Arbeit
Entschuldigung, wenn das unhöflich erschien. Das war nicht die Absicht. Ich wollte auf die Einschränkungen hinweisen. Ihre Antwort zeigt schlechte Praktiken ( find|xargsohne -0sollte wirklich verboten werden), daher die Abwahl. Die Ausgabe von findohne -print0ist nicht zuverlässig nachbearbeitbar. -print0ist nicht Standard. Allerdings sudo find / -name pg_hba.conf -exec cat {} +könnte Standard Sie auch dazu bringen, den Inhalt von zu /dev/urandomsichern (zum Beispiel, wenn jemand einen Symlink daraus erstellt /tmp/pg_hba.confhat und es keinen einfachen tragbaren Weg gibt, der zumindest keine Race-Bedingung hat).
Stéphane Chazelas
1
Verwenden wir nicht sudo"nur für den Fall", sollen wir?
Lindhe
Nun, es ist besser als zu rennensudo rm -rf /
Devinbost