Wie sende ich eine Datei als Eingabe an eine andere Datei?

7

Über die Befehlsshell können wir die drei Standard-Dateistreams umleiten, sodass wir Eingaben von einer Datei oder einem anderen Befehl anstelle von unserer Tastatur erhalten können, und wir können Ausgaben und Fehler in Dateien schreiben oder sie als Eingabe für nachfolgende Befehle senden.

Warum können wir also keine Eingabe für eine andere Datei als geben?

~# /root/Documents/text1.txt > /root/Documents/text2.txt
arvind
quelle

Antworten:

17

Sie können den Inhalt nicht file1 > file2kopieren file1, file2da dort kein Befehl vorhanden ist. Sie müssen einen Befehl ausgeben.

  • Umleitungen gelten für (1) einen Befehl, den Sie ausführen, oder (2) die Shell als Ganzes (falls auf das integrierte execElement angewendet). Sie ändern jedoch die Quelle oder das Ziel von Aktionen, die Eingabe-Ausgangs-Operationen ausführen, dh aus einer Datei oder einem Gerät lesen oder in diese schreiben. Sie müssen tatsächlich eine Aktion ausführen.
  • file1 > file2ist ein gültiger Befehl, unter Umständen aber nicht kopiert nicht file1zu file2. Stattdessen wie l0b0 sagt , versucht es , zu laufen file1 als ein Programm oder Skript, und - ob oder nicht , die erfolgreich ist - sendet die Standard - Ausgabe vom Laufen file1in file2. (Wenn file2es sich um eine reguläre Datei handelt, wird diese überschrieben.)
  • Es ist verlockend zu glauben, dass so etwas <file1 >file2funktionieren würde. Dies ist jedoch nicht der Fall: Wenn Sie den Befehl weglassen, wird keine Operation ausgeführt. file1wird als Eingabe verwendet und file2wird als Ausgabe verwendet ... aber da nichts getan wird , ist die Ausgabe leer. Der einzige Effekt besteht darin, (a) zu erstellen, file2wenn sie noch nicht vorhanden war, oder (b) file2leer zu machen, wenn dies der Fall war ::

    ek@Ilex:~$ echo foobar > file1
    ek@Ilex:~$ echo quux > file2
    ek@Ilex:~$ cat file1
    foobar
    ek@Ilex:~$ cat file2
    quux
    ek@Ilex:~$ <file1 >file2
    ek@Ilex:~$ cat file2
    ek@Ilex:~$ file file1 file2
    file1: ASCII text
    file2: empty

Du willst wahrscheinlich nur rennen cp file1 file2.

Angenommen, es handelt sich file2um eine reguläre Datei (oder existiert nicht, aber Sie möchten, dass sie nach der Ausführung Ihres Befehls als reguläre Datei existiert), sollten Sie den cpBefehl wahrscheinlich einfach verwenden .

Wie Sylvain Pineau sagt , können Sie auch verwenden cat file1 > file2. Der cpBefehl verhält sich jedoch gut, wenn in eine bereits vorhandene Datei geschrieben wird: Er überschreibt das Ziel mit der Quelle, behält jedoch die ursprüngliche Berechtigungsmaske des Ziels bei (und ist daher auch in Situationen gut, in denen man intuitiv denken könnte, dass dies cat file1 > file2erforderlich ist):

ek@Ilex:~$ echo glockenspiel > file1
ek@Ilex:~$ echo flugelhorn > file2
ek@Ilex:~$ cat file1
glockenspiel
ek@Ilex:~$ cat file2
flugelhorn
ek@Ilex:~$ chmod +x file2
ek@Ilex:~$ ls -l file1 file2
-rw-rw-r-- 1 ek ek 13 Sep 16 03:28 file1
-rwxrwxr-x 1 ek ek 11 Sep 16 03:28 file2
ek@Ilex:~$ cp file1 file2
ek@Ilex:~$ cat file2
glockenspiel
ek@Ilex:~$ ls -l file1 file2
-rw-rw-r-- 1 ek ek 13 Sep 16 03:28 file1
-rwxrwxr-x 1 ek ek 13 Sep 16 03:28 file2

Zum Anhängen möchten Sie wahrscheinlich eine (andere) Umleitung.

Sowohl der cpBefehl und Umleitung mit >wird überschreiben den Inhalt einer normalen Datei, wenn es vorhanden ist . Die >>Umleitung wird jedoch angehängt.

Also , wenn Sie den Inhalt angehängt werden sollen , file1um file2statt Überschreiben file2mit dem Inhalt file1, eine Umleitung mit >>( nicht > ) ist eine gute Wahl:

ek@Ilex:~$ echo 'Violets are blue.' > file1
ek@Ilex:~$ echo 'Roses are red.' > file2
ek@Ilex:~$ cat file1
Violets are blue.
ek@Ilex:~$ cat file2
Roses are red.
ek@Ilex:~$ cat file1 >> file2
ek@Ilex:~$ cat file2
Roses are red.
Violets are blue.
Eliah Kagan
quelle
8

Sie können den Inhalt von text1.txt mit dem folgenden catBefehl umleiten :

~# cat /root/Documents/text1.txt > /root/Documents/text2.txt

Hinweis : Sie können catdamit auch neue Binärdateien erstellen, z.

~# cat mypic.jpg > my_new_pic.jpg
Sylvain Pineau
quelle
1
Die andere Antwort scheint ihr Bestes zu geben, um das Ganze viel zu kompliziert erscheinen zu lassen. Ja, in diesem vereinfachenden Beispiel können Sie nur verwenden cp. Ich interpretiere die Frage des OP jedoch so, wie man aus einer Datei im Allgemeinen eine Pipe erstellt. In diesem Sinne ist dies die beste Antwort. Kurz gesagt, catist ein wesentlicher, allgemeiner Befehl für viele Befehlszeilenaufgaben.
Thomasrutter
1
@neon_overload Die Frage hier betrifft die Umleitung, nicht die Weiterleitung. (Ich bin nicht anderer Meinung als der Teil Ihres Kommentars, der besagt, dass diese Antwort wertvoll ist - diese Antwort verwechselt diese beiden Konzepte nicht.) Eine Frage zum Piping aus einer Datei im Allgemeinen würde Antworten erfordern, die über Pipes sprechen (mit |). Eine Frage zum Umleiten von einer Datei im Allgemeinen würde Antworten erfordern, die erklären, wie zum Umleiten von Dateien mit <, wie es die Antworten von nux und Stephen Quan tun, aber weder diese noch meine Antwort.
Eliah Kagan
1

Um die Antwort von @ SylvainPineau zu erweitern , können Sie dies nicht tun, /root/Documents/text1.txt > /root/Documents/text2.txtweil das Ding vom Umleitungsoperator und der Datei getrennt ist, nachdem es ein Befehl sein muss. Wenn Sie ausführen /root/Documents/text1.txt > /root/Documents/text2.txt, weisen Sie die Shell an, ausgeführt zu werden /root/Documents/text1.txt , was wahrscheinlich nicht einmal ausgeführt wird, da für Textdateien das Ausführungsflag nicht gesetzt sein sollte, und die Standardausgabe in speichern /root/Documents/text2.txt. Da die Standardausgabe dieses "Befehls" leer ist, ist die Zieldatei leer.

l0b0
quelle
1
Um pedantisch zu sein, kann die Umleitung überall erscheinen. Zum Beispiel > out dateschreibt die aktuelle Zeit erfolgreich in die Datei "out".
Glenn Jackman
0

Befehlsausgabe Umleitung:

ls > file.txt

ls gibt eine Verzeichnisliste an und die Ausgabe des Befehls ls wird in file.txt umgeleitet.

Fehlerumleitung:

command 2>~/Desktop/errorsfile.txt

Dadurch wird das Fehlerergebnis des Befehls in eine txtDatei umgeleitet .

Für die Umleitung von Dateiinhalten:

  1. cat file1 > file2 (kopiert den Inhalt von Datei1 in eine neue Datei Datei2)
  2. cat file2 >> file1 (Hier wird der Inhalt von Datei2 in eine vorhandene Datei1 kopiert, ohne den Inhalt zu löschen.)
  3. cat file1 file2 > file3 (Dies würde den Inhalt von 'Datei1' und 'Datei2' hinzufügen und diesen Inhalt dann in eine neue Datei mit dem Namen 'Datei3' schreiben.)

Ich möchte auch The Input Redirection hinzufügen:

$ mail -s "Hello World" user@yourmaildomain.com < /home/user/mailcontent.txt

Wenn sich der E-Mail-Text in einer Datei befindet, können wir ihn direkt zum Senden der E-Mail verwenden.

nux
quelle
0

Wie andere bereits gesagt haben, fehlt Ihnen ein Befehl. Hier sind einige interessante Kombinationen:

cat <file1.txt >file2.txt
tail <file1.txt >file2.txt
head <file1.txt >file2.txt
wc -l <file1.txt >file2.txt
base64 <file1.txt >file2.txt
base64 -D <file1.txt >file2.txt
gzip -c <file1.txt >file2.txt
gunzip -c <file1.txt >file2.txt

Der Geist des Weiterleitens / Umleitens zeigt an, dass ein Befehl (wie Kopieren, Extrahieren, Zählen, Codieren / Decodieren, Komprimieren / Dekomprimieren) erforderlich ist, um die Aktion zum Umwandeln der Eingabe file1.txtin eine Ausgabe anzugeben file2.txt.

Stephen Quan
quelle