Wie füge ich Textdateien zusammen?

21

Ich habe viele Dokumente als txt gespeichert. Ich möchte sie zusammen drucken, also möchte ich sie zuerst zusammen in einer einzigen Datei haben. Die Reihenfolge spielt in diesem Fall keine Rolle.

Ich möchte eine Lösung, bei der nicht die Namen der zusammenzuführenden Dateien eingegeben werden, sondern nur alle TXT-Dateien im Ordner zusammengeführt werden.

Kann ich das mit einem Befehl oder einer GUI machen?


Ich habe hier geschaut . Ich weiß nicht, wie ich es verwenden soll join.


quelle

Antworten:

43

Mit catAusgabeumleitung verwenden. Syntax: cat file [file] [[file] ...] > joined-file.

Beispiel mit nur zwei Dateien (Sie können viel mehr haben):

$ echo "some text in a file" > file1
$ echo "another file with some text" > file2
$ cat file1 file2 > mergedfiles
$ cat mergedfiles
some text in a file
another file with some text

Wenn Sie "viele Dokumente" haben, verwenden Sie Shell Globbing (Muster):

cat input-files-dir/* > joined-file

Dadurch werden alle Dateien in diesem Verzeichnis mit dem aktuellen Verzeichnis verknüpft (wodurch verhindert wird, dass sie mit der Ausgabedatei selbst übereinstimmen). Es ist völlig unabhängig von der Verwendung catund Ausgabeumleitung - es ist nur Bash, das alle Dateien als Argumente für bereitstellt cat.


Datentypen

Es werden nur Dateien zusammengeklebt (verbunden), wie Sie es mit Papier und Klebeband tun würden. Es ist ihm egal, ob das tatsächliche Dateiformat dies verarbeiten kann. Es wird für Textdateien funktionieren, aber nicht für PDFs, ODTs usw. Nun, es wird sie zusammenkleben, aber es ist kein gültiges PDF / ODT mehr.


Reihenfolge des Beitritts

Wie Phoibos betonte, führt das Verschieben der Shell zu einer alphabetischen Reihenfolge der Dateinamen. So funktioniert Bash and Shell Globbing.


Nachtrag zum input file is output fileFehler

Wenn das Muster der Eingabedateien mit der gleichen Datei übereinstimmt, die ausgegeben wird, wird ein Fehler verursacht. Es ist ein Sicherheitsmerkmal. Beispiel: Beim cat *.txt > out.txtzweiten Start wird dies verursacht.

Was Sie dagegen tun können:

  • Wählen Sie ein spezifischeres Muster, das mit den tatsächlichen Eingabedateien übereinstimmt und nicht mit dem Ausgabenamen übereinstimmt. Beispiel: Das Muster der Eingabedateien *.txtmit der Ausgabedatei output.outkollidiert nicht.
  • Arbeite in verschiedenen Verzeichnissen. Im obigen Beispiel habe ich ein separates input-files-dirVerzeichnis verwendet, um alle Dateien in dem aktuellen Arbeitsverzeichnis abzulegen und auszugeben. Dies macht es unmöglich, diesen Fehler zu erhalten.
gertvdijk
quelle
@cipricus Ja, aber das ist ein sehr einfaches Shell-Globbing (Patterns). Probieren Sie Ihre Muster aus, indem Sie lsnur die Übereinstimmungen auflisten. ZB um ls *.txtzu sehen, was passt.
Gertvdijk
2
@cipricus Wie wäre es mit cat * .txt> JoinedFile.txt?
Sadi
1
Dies ist in der Tat gesunder Menschenverstand. Cat fängt zuerst alle .txt-Dateien ab und erstellt dann eine neue .txt-Datei, die im ersten Schritt nicht abgefangen werden kann ;-)
Sadi
1
@cipricus Es verbindet nur Dateien. Wie wenn Sie Papier mit Kleber und Klebeband verwenden würden! Die meisten "Dokumente" -Dateiformate wie PDF, die komprimiert sind, lassen dies nicht zu. Verwenden Sie einen PDF-Editor. Aber auf jeden Fall ging es bei Ihrer Frage um Textdateien .
Gertvdijk
1
Ich verstehe voll und ganz, dass die von Ihnen vorgeschlagene Methode (Erstellen eines Unterverzeichnisses, Verschieben von Dateien und anschließendes Verknüpfen) in manchen Fällen eine bessere Möglichkeit darstellt. Aber wenn wir nur alle Textdateien (alle mit der Erweiterung .txt) im aktuellen Verzeichnis cat * .txt> JoinedFile.txt zusammenfügen wollen, ist das perfekt. Ich habe es gerade aus Neugier getestet und es funktioniert, und es scheint, dass Cipricus auch das gleiche Ergebnis gefunden hat. (Und das System hat angefangen sich zu beschweren, dass wir hier nicht chatten sollten, sonst würde ich fragen, ob Sie diesem Neuling beibringen können, wie Sie die Formatierung in diesen Kommentaren ohne Symbolleiste verwenden können ;-)
Sadi
12

Eine einfache Möglichkeit, dies zu tun, ist die Verwendung von cat:

cat file1 file2 > joined_file

Wenn Sie nur ausgeben cat file1 file2, werden beide Dateien in der Standardausgabe angezeigt. Mit >leiten Sie einfach die Standardausgabe in eine Datei um. Das geht auch mit anderen Befehlen.

Jorge Suárez de Lis
quelle
Bitte lesen Sie die Frage. Sie möchten einzelne Dateinamen angeben, was das OP ausdrücklich nicht wollte!
Sri
2
Das war nicht in der ursprünglichen Frage. Ich habe meine Antwort nicht aktualisiert, da vollständigere Antworten erschienen sind.
Jorge Suárez de Lis
@ JorgeSuárezdeLis Obwohl diese Antwort OP bei seiner / ihrer Frage nicht direkt hilft, beachten Sie bitte, dass diese Antwort wahrscheinlich jemand anderem hilft, der nur ein paar Dateien hat, die er zusammenführen möchte. (oh hey, wie ich! danke! ^ - ^) +1
Souta
@ JorgeSuárezdeLis In der Tat. Sie haben Revision 2 der Frage vollständig beantwortet . Einige Minuten später, in Revision 3 , wurden die Anforderungen an die Antworten geändert.
Gertvdijk
5

Mach es mit einer einfachen Schleife:

for i in *.txt; do cat "$i" >> complete.txt; done

>> hängt an die Datei an.

Hinweis: Wenn Sie den Befehl aus irgendeinem Grund erneut ausführen müssen, müssen Sie ihn entfernen complete.txt, andernfalls würden Sie die Datei in sich selbst schreiben, was nicht funktioniert.

Phoibos
quelle
5
Dies wird auch funktionieren, aber ich sehe keine Notwendigkeit für eine for-Schleife, wenn Sie Argumente verwenden können cat.
Gertvdijk
1
Ja, du hast natürlich recht. Ich bin mir nur nicht sicher, welche Schwertreihenfolge ich benutze cat *.txt. Die for-Schleife sollte sortiert sein.
Phoibos
1
Es stellt sich heraus, * ist garantiert in alphabetischer Reihenfolge .
Phoibos
Ja, es ist genau das gleiche Shell-Globbing. Es spielt keine Rolle, ob Sie es forin Bash oder anderswo verwenden.
Gertvdijk
4

Wenn die Dateien, die Sie kombinieren möchten, alle in enden .txt, halten Sie es einfach:

cat *.txt > combined.txt

Wenn das Verzeichnis nur Textdateien enthält, ist es auch einfach:

cat * > combined.txt

(Beachten Sie combined.txt, dass eine erneute Erstellung in die Erweiterung von *einbezogen wird, was zu ungewöhnlichem Verhalten führt.)

Wenn Sie einige Dateien im Verzeichnis auswählen möchten und nicht andere, ist es am besten, wenn Sie anhand der Dateinamen unterscheiden können, welche Sie möchten. Wenn nicht, können Sie Lust bekommen mit find. Aber ich bezweifle, dass Sie so weit gehen müssen.

alexis
quelle
Danke. Wenn Sie sich die Kommentare zu der akzeptierten Antwort ansehen, hat Sadi genau das in einem Kommentar vorgeschlagen. Wenn deine Antwort die erste gewesen wäre, wäre deine Antwort das gewesen, was ich brauche. sieh dir auch meins an: habe das im benutzerdefinierten Menü hinzugefügt
Danke für die Rückmeldung. Ja, ich sehe es jetzt, es war ein bisschen verdeckt ...
Alexis
4

Das von cipricus geschriebene Thunar-Skript für benutzerdefinierte Aktionen hat mich auch dazu inspiriert, ein ähnliches Nautilus-Skript zu schreiben . Hier ist es also:

#!/bin/sh
#Nautilus Script to join selected text files in a single file and open the joined file with default text editor
#
IFS=$'\n'
FILENAME="JoinedFile_$(date +%Y-%m-%d-%H-%M-%S).txt"
cat "$@" > "$FILENAME"
xdg-open "$FILENAME"
Sadi
quelle
@ David Foerster Danke für die Bearbeitung. Ich hatte keine Probleme mit der alten Version (mit meinen eingeschränkten Testfällen) und sehe auch keine Probleme mit dieser verbesserten Version. Es tut mir leid, wenn ich aufgrund eines Fehlers in der vorherigen Version irgendwelche Unannehmlichkeiten verursacht habe.
Sadi
Es war nicht fehlerhaft, aber es enthielt eine unnötige Schleife, die das Verständnis des Codes erschwerte, imho.
David Foerster
2

Dies ist eine Ergänzung und eine Abwandlung der anderen Antworten, die sich darauf beziehen, diese Lösungen in die Handlungen von Thunar einfließen zu lassen.

Nicht alle von ihnen sind auf diese Weise verwendbar, aber einige sind es.

Ich fand es am interessantesten, ausgewählte Dateien aus Thunars Kontextmenü zusammenführen zu können .

Dies ist eine Variation von dem, was durch vorgeschlagen wurde Sadi in einem Kommentar gertvdijk ‚s Antwort :

   cat %N > JoinedFile

Nur ausgewählte Dateien werden verbunden. Beschränken Sie die Darstellungsbedingungen auf Textdateien.

Bildbeschreibung hier eingeben

Bildbeschreibung hier eingeben


Besonderer Dank geht an Sadi, deren Kommentar mir die klarste und aktuellste Lösung für mein Problem lieferte.

Ich habe die Antwort von gertvdijk als endgültig akzeptiert . Dies war nicht nur die Gelegenheit für Sadi, sondern scheint auch für andere von weiterem Wert zu sein, da es eine gut durchdachte und vollständige Lösung bietet (wenn auch etwas über meinen CLI-Lesefähigkeiten).

Gemeinschaft
quelle
2

Sie könnten auch versuchen, findBefehl,

find . -name "*.txt" -type f -exec cat {} + > file

Es findet .txtDateien im aktuellen Verzeichnis und führt den catBefehl für jede gefundene Datei aus. Schließlich wurde die gesamte Ausgabe in den Dateinamen umgeleitet file(der direkt im aktuellen Dateinamen erstellt wurde).

Erläuterung:

.                  # current directory

-name              # helps to find only .txt files.

-type f            # Only files

-exec cat {} +     # helps to run cat command on the founded .txt files.

>                  # Output redirection operator

file               # to store final output.
Avinash Raj
quelle