485 Stimmen

Mehrere Dateien zusammenfügen, aber den Dateinamen als Abschnittsüberschrift einfügen

Ich möchte eine Reihe von Textdateien im Terminal zu einer großen Datei verketten. Ich weiß, dass ich dies mit dem Befehl cat tun kann. Ich möchte jedoch, dass der Dateiname jeder Datei vor dem "Datendump" für diese Datei steht. Weiß jemand, wie man das macht?

was ich derzeit habe:

file1.txt = bluemoongoodbeer

file2.txt = awesomepossum

file3.txt = hownowbrowncow

cat file1.txt file2.txt file3.txt

gewünschte Leistung:

file1

bluemoongoodbeer

file2

awesomepossum

file3

hownowbrowncow

0 Stimmen

Ich bin eigentlich mit uuencode & uudecode etwas Ähnliches zu tun, ich brauche nicht die Datei lesbar dazwischen, nur das Ergebnis und Rohr sie zu einem anderen Befehl wieder

0 Stimmen

bat ist eine hervorragende Alternative zu cat wenn man einfach nur Lust hat siehe den Inhalt mehrerer Dateien

732voto

DS. Punkte 20324

Ich habe das Gleiche gesucht und diesen Vorschlag gefunden:

tail -n +1 file1.txt file2.txt file3.txt

Ausgabe:

==> file1.txt <==
<contents of file1.txt>

==> file2.txt <==
<contents of file2.txt>

==> file3.txt <==
<contents of file3.txt>

Wenn es nur eine einzige Datei gibt, wird die Kopfzeile nicht gedruckt. Wenn Sie GNU utils verwenden, können Sie -v um immer eine Kopfzeile zu drucken.

251voto

Theo Punkte 2307

Ich habe grep für etwas Ähnliches verwendet:

grep "" *.txt

Sie erhalten keine "Kopfzeile", sondern jeder Zeile wird der Dateiname vorangestellt.

134voto

Maxim_united Punkte 1751

Das sollte auch genügen:

$ find . -type f -print -exec cat {} \;
./file1.txt
Content of file1.txt
./file2.txt
Content of file2.txt

Hier ist die Erklärung für die Befehlszeilenargumente:

find    = linux `find` command finds filenames, see `man find` for more info
.       = in current directory
-type f = only files, not directories
-print  = show found file
-exec   = additionally execute another linux command
cat     = linux `cat` command, see `man cat`, displays file contents
{}      = placeholder for the currently found filename
\;      = tell `find` command that it ends now here

Außerdem können Sie Suchvorgänge durch boolesche Operatoren kombinieren, wie z.B. -and o -or . find -ls ist auch schön.

33voto

Steinfadt Punkte 299

Wenn es mehr als eine Eingabedatei gibt, wird die more verknüpft sie und fügt jeden Dateinamen als Kopfzeile hinzu.

Zum Verketten in eine Datei:

more *.txt > out.txt

Zur Verkettung mit dem Terminal:

more *.txt | cat

Beispielhafte Ausgabe:

::::::::::::::
file1.txt
::::::::::::::
This is
my first file.
::::::::::::::
file2.txt
::::::::::::::
And this is my
second file.

28voto

Chris Eberle Punkte 46685

Damit sollte es klappen:

for filename in file1.txt file2.txt file3.txt; do
    echo "$filename"
    cat "$filename"
done > output.txt

oder dies für alle Textdateien rekursiv zu tun:

find . -type f -name '*.txt' -print | while read filename; do
    echo "$filename"
    cat "$filename"
done > output.txt

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X