Ich möchte eine Reihe von Textdateien zu einer großen Datei im Terminal 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 aktuell 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
Antworten:
War auf der Suche nach dem gleichen Ding und fand dies als Hinweis:
Ausgabe:
Wenn nur eine einzige Datei vorhanden ist, wird der Header nicht gedruckt. Wenn Sie GNU-Utils verwenden, können Sie
-v
immer einen Header drucken.quelle
-n +1
Option! Eine Alternative :head -n-0 file1 file2 file3
.-n
und+1
wie in weglassen-n+1
.tail -n +1 *
war genau das, wonach ich gesucht habe, danke!sudo ulimit -n 1024; find -f . -name "*.rb" | xargs tail -n+1 > ./source_ruby.txt
Ich habe grep für etwas Ähnliches verwendet:
Es gibt Ihnen keinen 'Header', sondern stellt jeder Zeile den Dateinamen voran.
quelle
*.txt
sie nur auf eine Datei erweitert wird. In dieser Hinsicht würde ich ratengrep '' /dev/null *.txt
grep
druckt nur Dateikopfzeilen, wenn mehr als eine Datei vorhanden ist. Wenn Sie sicherstellen möchten, dass der Dateipfad immer gedruckt wird, verwenden Sie-H
. Wenn Sie nicht möchten, verwenden Sie die Header-h
. Beachten Sie auch, dass es(standard input)
für STDIN gedruckt wird.ag
(den silbernen Sucher) verwenden: Standardmäßig wirdag . *.txt
jeder Datei der Name und jeder Zeile die Nummer vorangestellt.-n
an grep auch Zeilennummern ergibt, mit denen Sie einfache Linters mit einer genauen Schreibweise schreiben können, die beispielsweise von Emacs erfasst werden kann.Dies sollte auch den Trick tun:
Meint:
Sie können Suchvorgänge außerdem über boolesche Operatoren wie
-and
oder kombinieren-or
.find -ls
ist auch schönquelle
-print
wird der Dateiname nicht vor dem gedrucktcat
.-printf
die Ausgabe anpassen. Zum Beispiel:find *.conf -type f -printf '\n==> %p <==\n' -exec cat {} \;
um die Ausgabe vontail -n +1 *
brew install findutils
und verwendengfind
stattfind
.find
die mehrere-exec
s erlaubt :find -name '*.conf' -exec printf '\n\e[33;1m%s\e[0m\n' {} \; -exec cat {} \;
Dies sollte den Trick tun:
oder um dies für alle Textdateien rekursiv zu tun:
quelle
$0
die gesamte Zeile ist, also haben Sie tatsächlich sich wiederholende Spalten darin ...Ich hatte eine Reihe von Dateien, die mit stats.txt endeten und 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 Header.
oder für einen allgemeinen Fall
quelle
more <FILES> | cat
Dadurch wird der vollständige Dateiname (einschließlich Pfad) und dann der Inhalt der Datei gedruckt. Es ist auch sehr flexibel, da Sie -name "expr" für den Befehl find verwenden und so viele Befehle ausführen können, wie Sie für die Dateien möchten.
quelle
grep
. Zur Verwendung mitbash
:find . -type f -print | grep PATTERN | xargs -n 1 -I {} -i bash -c 'echo ==== {} ====; cat {}; echo'
Ich mag diese Option
Die Ausgabe sieht folgendermaßen aus:
quelle
So gehe ich normalerweise mit der Formatierung um:
Normalerweise leite ich die Katze in einen Grep, um bestimmte Informationen zu erhalten.
quelle
for i in *
enthält keine Unterverzeichnisse.Und die fehlende awk-Lösung lautet:
quelle
1
am Ende des Ausdrucks erklären ?Sie können diesen einfachen Befehl anstelle einer for-Schleife verwenden.
quelle
Wenn Sie Farben mögen, versuchen Sie Folgendes:
oder:
oder: (mit installiertem Paket 'Multitail')
quelle
find . -type f -name "*.txt" | xargs -I {} bash -c "echo $'\e[33;1m'{}$'\e[0m';cat {}"
Wenn die Dateien alle denselben Namen haben oder mit denen sie übereinstimmen können
find
, können Sie (z. B.) Folgendes tun:Um zu finden, zeigen Sie den Pfad und die Katze jeder Datei.
quelle
Hier ist ein wirklich einfacher Weg. Sie sagten, Sie möchten Katze, was bedeutet, dass Sie die gesamte Datei anzeigen möchten. Sie müssen aber auch den Dateinamen ausdrucken.
Versuche dies
head -n99999999 *
oderhead -n99999999 file1.txt file2.txt file3.txt
Ich hoffe, das hilft
quelle
head -n -0 file.txt file2.txt file3.txt
. Funktioniert fürhead
in GNU CoreutilsDiese Methode druckt den Dateinamen und dann den Dateiinhalt:
Ausgabe:
quelle
-f
ist nützlich, wenn Sie eine Datei verfolgen möchten, in die geschrieben wird, die jedoch nicht im Rahmen der Anforderungen des OP liegt.Wenn Sie diese hässlichen ==> <== durch etwas anderes ersetzen möchten
Erläuterung:
tail -n +1 *.txt
- Alle Dateien im Ordner mit Header ausgebensed -e 's/==>/\n###/g' -e 's/<==/###/g'
- ersetzt==>
mit neuer Linie + ### und<==
mit nur ###>> "files.txt"
- Alle in eine Datei ausgebenquelle
quelle
Wenn Sie das Ergebnis im gleichen Format wie Ihre gewünschte Ausgabe haben möchten, können Sie Folgendes versuchen:
Ergebnis:
Sie können
echo -e
vor und nach dem Schnitt setzen, damit Sie auch den Abstand zwischen den Linien haben:Ergebnis:
quelle
for
Schleife durchläuft die Liste, zu der derls
Befehl geführt hat.$ ls file{1..3}.txt
Ergebnis: Beifile1.txt file2.txt file3.txt
jeder Iteration wirdecho
die$file
Zeichenfolge in einencut
Befehl geleitet, den ich.
als Feldtrennzeichen verwendet habe. Dabei wird fileX.txt in zwei Teile zerlegt und das Feld1 ausgedruckt (Feld2 ist der txt). Der Rest sollte klar sein... auf jene glomming , die bereits erwähnt haben Kopfarbeiten für einige von uns:
Ich muss die erste Zeile lesen. Wie bereits erwähnt, müssen Sie, wenn Sie mehr als 10 Zeilen möchten, Optionen hinzufügen (Kopf -9999 usw.).
Entschuldigung für das Posten eines abgeleiteten Kommentars; Ich habe nicht genügend Straßenguthaben, um jemanden zu kommentieren / zu ergänzen.
quelle
Zur Lösung dieser Aufgaben verwende ich normalerweise den folgenden Befehl:
Es ist eine sehr bequeme Möglichkeit, Dateien zu verketten, wenn die Anzahl der Dateien ziemlich groß ist.
quelle
Zuerst habe ich jede Datei erstellt: echo 'information'> file1.txt für jede Datei [123] .txt.
Dann habe ich jede Datei gedruckt, um sicherzustellen, dass die Informationen korrekt waren: Schwanzdatei? .Txt
Dann habe ich folgendes gemacht: tail file? .Txt >> Mainfile.txt. Dadurch wurde die Datei Mainfile.txt erstellt, um die Informationen in jeder Datei in einer Hauptdatei zu speichern.
cat Mainfile.txt bestätigte, dass es in Ordnung war.
==> file1.txt <== bluemoongoodbeer
==> file2.txt <== awesomepossum
==> file3.txt <== hownowbrowncow
quelle