Ich möchte den Inhalt von fünf Dateien unverändert in eine Datei kopieren. Ich habe versucht, es mit cp für jede Datei zu tun. Dadurch wird jedoch der Inhalt überschrieben, der aus der vorherigen Datei kopiert wurde. Ich habe es auch versucht
paste -d "\n" 1.txt 0.txt
und es hat nicht funktioniert.
Ich möchte, dass mein Skript die neue Zeile am Ende jeder Textdatei hinzufügt.
z.B. Dateien 1.txt, 2.txt, 3.txt. Gib den Inhalt von 1,2,3 in 0.txt ein
Wie mache ich es ?
Sie benötigen den Befehl cat
(Abkürzung für Concatenate) mit Shell-Umleitung (>
) in Ihrer Ausgabedatei
cat 1.txt 2.txt 3.txt > 0.txt
Eine andere Option für diejenigen unter Ihnen, die immer noch wie ich über diesen Beitrag stolpern, ist die Verwendung von find -exec
:
find . -type f -name '*.txt' -exec cat {} + >> output.file
In meinem Fall brauchte ich eine robustere Option, die mehrere Unterverzeichnisse durchblätterte, also entschied ich mich für die Verwendung von find
. Brechen sie ab:
find .
Suchen Sie im aktuellen Arbeitsverzeichnis.
-type f
Nur an Dateien interessiert, nicht an Verzeichnissen usw.
-name '*.txt'
Verfeinern Sie die Ergebnismenge mit dem Namen
-exec cat {} +
Führen Sie den Befehl cat für jedes Ergebnis aus. "+" bedeutet, dass nur 1 Instanz von cat
erzeugt wird (thx @gniourf_gniourf)
>> output.file
Hängen Sie, wie in anderen Antworten erläutert, den Inhalt der Kategorie an das Ende einer Ausgabedatei an.
wenn Sie einen bestimmten Ausgabetyp haben, machen Sie so etwas
cat /path/to/files/*.txt >> finalout.txt
Wenn sich alle Ihre Dateien in einem einzigen Verzeichnis befinden, können Sie dies einfach tun
cat * > 0.txt
Dateien 1.txt, 2.txt, .. werden in 0.txt verschoben
for i in {1..3}; do cat "$i.txt" >> 0.txt; done
Ich habe diese Seite gefunden, weil ich 952 Dateien zu einer zusammenfügen musste. Ich fand, dass dies viel besser funktioniert, wenn Sie viele Dateien haben. Dies führt eine Schleife für so viele Zahlen durch, wie Sie benötigen, und katze jede mit >> an das Ende von 0.txt.
Wenn alle Ihre Dateien einen ähnlichen Namen haben, können Sie einfach Folgendes tun:
cat *.log >> output.log
Eine andere Option ist sed
:
sed r 1.txt 2.txt 3.txt > merge.txt
Oder...
sed h 1.txt 2.txt 3.txt > merge.txt
Oder...
sed -n p 1.txt 2.txt 3.txt > merge.txt # -n is mandatory here
Oder ohne Weiterleitung ...
sed wmerge.txt 1.txt 2.txt 3.txt
Beachten Sie, dass in der letzten Zeile auch merge.txt
(nicht wmerge.txt
!) Geschrieben wird. Sie können w"merge.txt"
verwenden, um Verwechslungen mit dem Dateinamen zu vermeiden, und -n
für die stille Ausgabe.
Natürlich können Sie die Dateiliste auch mit Platzhaltern kürzen. Beispielsweise können Sie bei nummerierten Dateien wie in den obigen Beispielen den Bereich in geschweiften Klammern wie folgt angeben:
sed -n w"merge.txt" {1..3}.txt
Wenn die Originaldatei nicht druckbare Zeichen enthält, gehen diese bei Verwendung des Befehls cat verloren. Mit 'cat -v' werden die nicht druckbaren Zeichen in sichtbare Zeichenfolgen konvertiert, aber die Ausgabedatei enthält immer noch nicht die tatsächlichen nicht druckbaren Zeichen in der Originaldatei. Bei einer geringen Anzahl von Dateien kann eine Alternative darin bestehen, die erste Datei in einem Editor (z. B. vim) zu öffnen, der nicht druckbare Zeichen verarbeitet. Gehen Sie dann zum Ende der Datei und geben Sie ": r zweiter_Dateiname" ein. Dadurch wird die zweite Datei mit nicht druckbaren Zeichen eingezogen. Das gleiche könnte für zusätzliche Dateien gemacht werden. Wenn alle Dateien eingelesen wurden, geben Sie ": w" ein. Das Endergebnis ist, dass die erste Datei jetzt das enthält, was sie ursprünglich getan hat, plus den Inhalt der Dateien, die eingelesen wurden.
wenn Ihre Dateien Header enthalten und Sie diese in der Ausgabedatei entfernen möchten, können Sie Folgendes verwenden:
for f in `ls *.txt`; do sed '2,$!d' $f >> 0.out; done
Wenn Sie den Inhalt von 3 Dateien in eine Datei einfügen möchten, ist der folgende Befehl eine gute Wahl:
cat file1 file2 file3 | tee -a file4 > /dev/null
Es kombiniert den Inhalt aller Dateien in Datei4 und gibt die Konsolenausgabe an /dev/null
aus.