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

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

Ich möchte die Ausgabe des findBefehls an catden Befehl umleiten, damit ich die Daten der angegebenen Datei drucken kann.

Wenn die Ausgabe von find beispielsweise lautet, /aFile/readmesollte die Katze als interpretiert werden cat ./aFile/readme. Wie kann ich das sofort tun?

Muss ich Rohre verwenden?

Ich habe folgende Versionen ausprobiert:

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

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

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

Antwort1

findDies können Sie allein mit der folgenden Aktion tun -exec:

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

{}wird durch die von gefundenen Dateien ersetzt findund +ermöglicht es uns, so viele Argumente wie möglich pro Aufruf von zu lesen cat, da catmehrere Argumente angenommen werden können.

Wenn Ihre findnicht die Standarderweiterung hat +oder Sie die Dateien einzeln lesen möchten:

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

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

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

Hier nutze ich die -nMöglichkeit die Zeilennummern abzurufen.

Antwort2

Befehlsersetzung

Eine weitere Möglichkeit ist die VerwendungBefehlsersetzung. Wenn Sie einen Befehl einschließen, $()wird der Befehl ausgeführt und durch seine Ausgabe ersetzt.

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

wird werden

cat ./inhere/file1 ./inhere/file2 ./inhere/file3

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

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

Weitere Details finden Sie in den oben verlinkten Dokumenten

Bash führt die Erweiterung durch, indem es den Befehl in einer Subshell-Umgebung ausführt und die Befehlsersetzung durch die Standardausgabe des Befehls ersetzt, wobei alle nachfolgenden Zeilenumbrüche gelöscht werden. Eingebettete Zeilenumbrüche werden nicht gelöscht, können aber während der Worttrennung entfernt werden. Die Befehlsersetzung $(cat file)kann durch das Äquivalent ersetzt werden, ist aber schneller $(< file).

Wenn die Backquote-Form der Ersetzung im alten Stil verwendet wird, behält der Backslash seine wörtliche Bedeutung, außer wenn er von $, `, oder gefolgt wird \. Das erste Backquote, dem kein Backslash vorangeht, beendet die Befehlsersetzung. Bei Verwendung dieser $(command)Form bilden alle Zeichen zwischen den Klammern den Befehl; keines wird speziell behandelt.

Befehlsersetzungen können verschachtelt werden. Um sie bei Verwendung der Backquotes-Form zu verschachteln, maskieren Sie die inneren Backquotes mit Backslashes.

Wenn die Ersetzung in Anführungszeichen steht, werden für die Ergebnisse keine Worttrennung und keine Dateinamenerweiterung durchgeführt.

Sehendiese andere Antwortfür einige gute Anwendungsbeispiele.

Antwort3

Dadurch werden der Name und der 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 {} \;

Antwort4

Verwenden Sie Pipe und Xargs

find /* -name pg_hba.conf | xargs cat

Wenn der Vorgang aufgrund fehlender Berechtigungen fehlschlägt, können Sie mit „sudo“ sicherstellen, dass Sie über die Berechtigung verfügen, den Befehl „find“ für das durchsuchte Verzeichnis auszuführen.

 sudo find /* -name pg_hba.conf | xargs sudo cat

verwandte Informationen