it-swarm.com.de

Verketten Sie mehrere Dateien, fügen Sie jedoch den Dateinamen als Abschnittsheader ein

Ich möchte einige Textdateien zu einer großen Datei im Terminal zusammenfügen. Ich weiß, dass ich dies mit dem Befehl cat tun kann. Ich möchte jedoch, dass der Dateiname jeder Datei vor dem "Datenauszug" für diese Datei steht. Weiß jemand, wie das geht?

was ich momentan habe:

file1.txt = bluemoongoodbeer

file2.txt = awesomepossum

file3.txt = hownowbrowncow

cat file1.txt file2.txt file3.txt

gewünschte Ausgabe:

file1

bluemoongoodbeer

file2

awesomepossum

file3

hownowbrowncow
289
Nick

War auf der Suche nach der gleichen Sache, und stellte fest, dass:

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 nur eine einzige Datei vorhanden ist, wird die Kopfzeile nicht gedruckt. Bei Verwendung von GNU - Utils können Sie mit -v immer eine Kopfzeile drucken.

425
DS.

Ich habe grep für etwas Ähnliches verwendet:

grep "" *.txt

Sie erhalten keine Kopfzeile, sondern fügen jeder Zeile den Dateinamen voran.

163
Theo

Dies sollte auch den Trick tun:

find . -type f -print -exec cat {} \;

Meint:

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

Sie können die Suche auch durch boolesche Operatoren wie -and oder -or kombinieren. find -ls ist auch nett.

87
Maxim_united

Das sollte den Trick tun:

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

oder um 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
21
Chris Eberle
find . -type f -print0 | xargs -0 -I % sh -c 'echo %; cat %'

Dadurch wird der vollständige Dateiname (einschließlich Pfad) und der Inhalt der Datei gedruckt. Es ist auch sehr flexibel, da Sie -name "expr" für den Befehl find verwenden können und beliebig viele Befehle für die Dateien ausführen können.

15
kevinf

Ich hatte eine Reihe von Dateien, die mit stats.txt endeten, die ich mit den Dateinamen verketten wollte.

Ich habe folgendes getan, und wenn es mehr als eine Datei gibt, enthält der Befehl "more" den Dateinamen als Kopfzeile.

more *stats.txt > stats.txt

oder für einen allgemeinen Fall

more FILES_TO_CONCAT > OUTPUT_FILE
15
Steinfadt

So gehe ich normalerweise mit Formatierungen um:

for i in *; do echo "$i"; echo ; cat "$i"; echo ; done ;

Im Allgemeinen leite ich die Katze in ein grep für spezifische Informationen. 

4
MorpheousMarty

Ich mag diese Option 

for x in $(ls ./*.php); do echo $x; cat $x | grep -i 'menuItem'; done

Die Ausgabe sieht folgendermaßen aus:

./debug-things.php
./Facebook.Pixel.Code.php
./footer.trusted.seller.items.php
./GoogleAnalytics.php
./JivositeCode.php
./Live-Messenger.php
./mPopex.php
./NOTIFICATIONS-box.php
./reviewPopUp_Frame.php
            $('#top-nav-scroller-pos-<?=$active**MenuItem**;?>').addClass('active');
            gotTo**MenuItem**();
./Reviews-Frames-PopUps.php
./social.media.login.btns.php
./social-side-bar.php
./staticWalletsAlerst.php
./tmp-fix.php
./top-nav-scroller.php
$active**MenuItem** = '0';
        $active**MenuItem** = '1';
        $active**MenuItem** = '2';
        $active**MenuItem** = '3';
./Waiting-Overlay.php
./Yandex.Metrika.php
4
ch3ll0v3k

sie können diesen einfachen Befehl verwenden, anstatt eine for-Schleife zu verwenden.

ls -ltr | awk '{print $9}' | xargs head
3
Gagan

Wenn Sie Farben mögen, versuchen Sie Folgendes:

for i in *; do echo; echo $'\e[33;1m'$i$'\e[0m'; cat $i; done | less -R

oder:

tail -n +1 * | grep -e $ -e '==.*'

oder: (mit installiertem Paket 'Multitail')

multitail *
2
sjas

Hier ist ein wirklich einfacher Weg. Sie sagten, Sie möchten katzen, was bedeutet, dass Sie die gesamte Datei anzeigen möchten. Sie benötigen aber auch den Dateinamen.

Versuche dies

head -n99999999 * oder head -n99999999 file1.txt file2.txt file3.txt

Hoffentlich hilft das

2
Trey Brister

Diese Methode druckt den Dateinamen und dann den Inhalt der Datei:

tail -f file1.txt file2.txt

Ausgabe:

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

==> file2.txt <==
contents of file2.txt ...
contents of file2.txt ...
1
serenesat
find . -type f -exec cat {} \; -print
0
user5689319

Wenn Sie diese hässlichen ==> <== durch etwas anderes ersetzen möchten

tail -n +1 *.txt | sed -e 's/==>/\n###/g' -e 's/<==/###/g' >> "files.txt"

erläuterung:

tail -n +1 *.txt - gibt alle Dateien im Ordner mit Header aus

sed -e 's/==>/\n###/g' -e 's/<==/###/g' - ==> durch neue Zeile ersetzen + ### und <== mit nur ### 

>> "files.txt" - Alles in eine Datei ausgeben

0
boroboris

Wenn die Dateien alle den gleichen Namen haben oder mit find abgeglichen werden können, können Sie (z. B.) Folgendes tun:

find . -name create.sh | xargs tail -n +1

um zu finden, zeigen Sie den Pfad und cat jeder Datei.

0
drkvogel

Wenn Sie das Ergebnis in demselben Format wie Ihre gewünschte Ausgabe haben möchten, können Sie Folgendes versuchen:

for file in `ls file{1..3}.txt`; \
do echo $file | cut -d '.' -f 1; \ 
cat $file  ; done;

Ergebnis: 

file1
bluemoongoodbeer
file2
awesomepossum
file3
hownowbrowncow

Sie können echo -e vor und nach dem Schnitt einfügen, so dass Sie auch den Abstand zwischen den Zeilen haben:

$ for file in `ls file{1..3}.txt`; do echo $file | cut -d '.' -f 1; echo -e; cat $file; echo -e  ; done;

Ergebnis:

file1

bluemoongoodbeer

file2

awesomepossum

file3

hownowbrowncow
0
Fekete Sumér

Um diese Aufgaben zu lösen, verwende ich normalerweise den folgenden Befehl:

$ cat file{1..3}.txt >> result.txt

Dies ist eine sehr bequeme Möglichkeit, Dateien zu verketten, wenn die Anzahl der Dateien sehr groß ist.

0
Igor

Und die fehlende awk-Lösung ist:

$ awk '(FNR==1){print ">> " FILENAME " <<"}1' *
0
kvantour
  • AIX 7.1 ksh

... auf diejenigen, die schon erwähnt haben, dass head für einige von uns arbeitet:

$ r head
head file*.txt
==> file1.txt <==
xxx
111

==> file2.txt <==
yyy
222
nyuk nyuk nyuk

==> file3.txt <==
zzz
$

Ich muss die erste Zeile lesen. Wenn Sie mehr als 10 Zeilen benötigen, müssen Sie Optionen hinzufügen (head -9999 usw.).

Bitte entschuldigen Sie einen abgeleiteten Kommentar. Ich habe nicht genügend Straßennutzungsrechte, um jemanden zu kommentieren/hinzuzufügen.

0
JustinKaisse