it-swarm.com.de

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

Ich möchte die Ausgabe des Befehls find auf den Befehl cat umleiten, damit ich die Daten der angegebenen Datei drucken kann.

Wenn die Ausgabe von find beispielsweise /aFile/readme Ist, sollte die Katze als cat ./aFile/readme Interpretiert werden. 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.

13
Eksapsy

Sie können dies mit find alleine tun, indem Sie die Aktion -exec Verwenden:

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 cat zu lesen, da cat mehrere Argumente annehmen kann.

Wenn Ihr find nicht die Erweiterung + Hat oder Sie die Dateien einzeln lesen möchten:

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

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

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

Hier verwende ich die Option -n, Um die Zeilennummern zu erhalten.

21
heemayl

Befehlsersetzung

Eine andere Option ist die Verwendung von Befehlsersetzung . Wenn Sie einen Befehl in $() 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 aus 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 Word-Aufteilung entfernt werden. Die Befehlssubstitution $(cat file) kann durch die entsprechende, aber schnellere $(< file) ersetzt werden.

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

Befehlsersetzungen können verschachtelt sein. Um zu verschachteln, wenn Sie das Formular mit den Anführungszeichen verwenden, maskieren Sie die inneren Anführungszeichen mit Backslashes.

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

Siehe diese andere Antwort für einige gute Anwendungsbeispiele.

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 {} \;
0