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 aus der vorherigen Datei kopierte Inhalt überschrieben. 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. Geben Sie den Inhalt von 1,2,3 in 0.txt ein
Wie mache ich es ?
Antworten:
Sie benötigen den
cat
Befehl (kurz für verketten) mit Shell Redirection (>
) in Ihre Ausgabedateiquelle
>>
, um eine Datei an eine andere anzuhängen , wobei die Ausgabedatei mit den Anweisungen>
überschrieben wird . Gibt es für die neue Zeile eine neue Zeile als erstes Zeichen in der Datei1.txt
? Sie können herausfinden,od -c
ob das erste Zeichen a ist\n
.{...}
für den Dateinamenabgleich. Vielleicht haben die Anführungszeichen die Dinge in Ihrem Skript etwas durcheinander gebracht? Ich versuche immer, mit solchen Dingenls
in einer Shell zu arbeiten. Wenn ich den Befehl richtig verstanden habe, schneide ich ihn einfach aus und füge ihn so wie er ist in ein Skript ein. Möglicherweise ist die-x
Option auch in Ihren Skripten hilfreich. Sie gibt die erweiterten Befehle im Skript vor der Ausführung wieder.Eine andere Option für diejenigen unter Ihnen, die immer noch wie ich über diesen Beitrag stolpern, ist die Verwendung von
find -exec
:In meinem Fall brauchte ich eine robustere Option, die mehrere Unterverzeichnisse durchsucht, also entschied ich mich für die Verwendung
find
. Brechen sie ab:Suchen Sie im aktuellen Arbeitsverzeichnis.
Interessiert sich nur für Dateien, nicht für Verzeichnisse usw.
Reduzieren Sie die Ergebnismenge nach Namen
Führen Sie den Befehl cat für jedes Ergebnis aus. "+" bedeutet, dass nur 1 Instanz von erzeugt
cat
wird (thx @gniourf_gniourf)Hängen Sie, wie in anderen Antworten erläutert, den Inhalt der Katze an das Ende einer Ausgabedatei an.
quelle
*.txt
in Anführungszeichen gesetzt werden (andernfalls ist der gesamtefind
Befehl, wie geschrieben, nutzlos). Ein weiterer Fehler ergibt sich aus einem groben Missverständnis: Der Befehl, der ausgeführt wirdcat >> 0.txt {}
, ist nicht , abercat {}
. Ihr Befehl entspricht in der Tat{ find . -type f -name *.txt -exec cat '{}' \; ; } >> 0.txt
(ich habe eine Gruppierung hinzugefügt, damit Sie erkennen, was wirklich passiert). Ein weiterer Fehler besteht darin, dassfind
die Datei gefunden0.txt
wird undcat
sich beschwert, dass die Eingabedatei eine Ausgabedatei ist .>> output.file
am Ende Ihres Befehls setzen, damit Sie niemanden (einschließlich sich selbst) zum Denkenfind
anregen, dascat {} >> output.file
für jede gefundene Datei ausgeführt wird.-exec cat {} +
statt-exec cat {} \;
, damit nur eine Instanz voncat
mit mehreren Argumenten erzeugt wird (+
wird von POSIX angegeben ).find . -type f -exec cat {} + >> outputfile.txt
habe meine geändert in: und konnte nicht herausfinden, warum meine Ausgabedatei nicht aufhören würde, in die Gigs hineinzuwachsen, obwohl das Verzeichnis nur 50 Megabyte groß war. Es war, weil ich die Datei outputfile.txt immer wieder an mich selbst angehängt habe! Stellen Sie also sicher, dass Sie diese Datei korrekt benennen, oder legen Sie sie vollständig in einem anderen Verzeichnis ab, um dies zu vermeiden.Wenn Sie einen bestimmten Ausgabetyp haben, gehen Sie wie folgt vor
quelle
file_1
,,file_2
…file_11
, Aufgrund der natürlichen Reihenfolge, in der Dateien sortiert werden.Wenn sich alle Ihre Dateien in einem einzigen Verzeichnis befinden, können Sie dies einfach tun
cat * > 0.txt
Dateien 1.txt, 2.txt, .. gehen in 0.txt
quelle
file_1
,,file_2
…file_11
, Aufgrund der natürlichen Reihenfolge, in der Dateien sortiert werden.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 katzen Sie jede mit >>, um sie an das Ende von 0.txt anzuhängen.
quelle
Wenn alle Ihre Dateien ähnlich benannt sind, können Sie einfach Folgendes tun:
quelle
Eine weitere Option ist
sed
:Oder...
Oder...
Oder ohne Weiterleitung ...
Beachten Sie, dass in der letzten Zeile auch geschrieben wird
merge.txt
(nichtwmerge.txt
!). Sie können verwendenw"merge.txt"
, um Verwechslungen mit dem Dateinamen zu vermeiden, und-n
um eine stille Ausgabe zu ermöglichen.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 mit geschweiften Klammern wie folgt angeben:
quelle
Wenn Ihre Dateien Header enthalten und Sie diese in der Ausgabedatei entfernen möchten, können Sie Folgendes verwenden:
quelle
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 kleinen Anzahl von Dateien kann eine Alternative darin bestehen, die erste Datei in einem Editor (z. B. vim) zu öffnen, der nicht druckbare Zeichen verarbeitet. Manövrieren Sie dann zum Ende der Datei und geben Sie ": r second_file_name" ein. Dadurch wird die zweite Datei eingezogen, einschließlich nicht druckbarer Zeichen. 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 nun das enthält, was sie ursprünglich getan hat, sowie den Inhalt der eingelesenen Dateien.
quelle
Wenn Sie den Inhalt von 3 Dateien an eine Datei anhängen möchten, ist der folgende Befehl eine gute Wahl:
Es wird den Inhalt aller Dateien in Datei4 kombinieren und die Konsolenausgabe an senden
/dev/null
.quelle