
Ich möchte die Ausgabe des find
Befehls an cat
den Befehl umleiten, damit ich die Daten der angegebenen Datei drucken kann.
Wenn die Ausgabe von find beispielsweise lautet, /aFile/readme
sollte 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
find
Dies können Sie allein mit der folgenden Aktion tun -exec
:
find /location -size 1033c -exec cat {} +
{}
wird durch die von gefundenen Dateien ersetzt find
und +
ermöglicht es uns, so viele Argumente wie möglich pro Aufruf von zu lesen cat
, da cat
mehrere Argumente angenommen werden können.
Wenn Ihre find
nicht 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 -n
Mö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