Ich möchte die Ausgabe des find
Befehls auf cat
Befehl umleiten , damit ich die Daten der angegebenen Datei drucken kann.
Wenn zum Beispiel die Ausgabe von find ist, sollte /aFile/readme
die 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.
cat
die-n
Option wusste , überrascht mich. Ich liebe es, zufällige Fragen zu lesen.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.wird werden
Dies entspricht mehr oder weniger der Verwendung des älteren Stils zum Umschließen von Befehlen mit Back Ticks:
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.
quelle
find
Auffinden zu vieler Dateien ein Fehler "Argumentliste zu lang" generiert wird, der beim Aufrufen versucht wirdcat
. Es würde auch Probleme beim Umgang mit Dateinamen geben, die Leerzeichen enthalten, und möglicherweise auch mit Dateinamen, die Dateinamen-Globbing-Zeichen enthalten.Dadurch werden Name und Inhalt von Textdateien (ASCII) nur rekursiv gedruckt.
Noch ein Versuch
quelle
Verwenden Sie Pipe und Xargs
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.
quelle
/tmp/ /dev/urandom /pg_hba.conf
hat, kann root den gesamten Inhalt von/dev/urandom
. Schlimmer kann wahrscheinlich je nach Kontext getan werden.xargs
sollte fast nie ohne oder gar nicht verwendet werden-0
. Wäresudo xargs
auch besser alsxargs sudo
. Und/*
wäre besser als/
.find|xargs
ohne-0
sollte wirklich verboten werden), daher die Abwahl. Die Ausgabe vonfind
ohne-print0
ist nicht zuverlässig nachbearbeitbar.-print0
ist nicht Standard. Allerdingssudo find / -name pg_hba.conf -exec cat {} +
könnte Standard Sie auch dazu bringen, den Inhalt von zu/dev/urandom
sichern (zum Beispiel, wenn jemand einen Symlink daraus erstellt/tmp/pg_hba.conf
hat und es keinen einfachen tragbaren Weg gibt, der zumindest keine Race-Bedingung hat).sudo
"nur für den Fall", sollen wir?sudo rm -rf /