Verketten Sie mehrere Dateien beinhalten aber mit dem Namen als section-Header
Möchte ich verketten Sie eine Reihe von text-Dateien in eine große Datei im terminal. Ich weiß, ich kann dies tun, indem Sie den cat-Befehl. Ich möchte jedoch den Dateinamen jeder Datei, um Sie vor dem "Daten-dump" für die Datei. Wer weiß, wie dies zu tun?
was ich derzeit 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
- ich bin eigentlich mit uuencode & uudecode, etwas ähnliches zu tun, ich brauche nicht die Datei lesbar ist dazwischen, müssen nur das Ergebnis und Pfeife Sie zu einem anderen Befehl wieder
- unix.stackexchange.com/questions/12342/...
Du musst angemeldet sein, um einen Kommentar abzugeben.
War auf der Suche für die gleiche Sache, und fand dies nahe zu legen:
Ausgabe:
Wenn es nur eine einzelne Datei, dann wird der header nicht gedruckt werden. Bei Verwendung von GNU utils, die Sie verwenden können
-v
immer drucken eine Kopfzeile.tail +1 *.txt
) bekomme ich eine FehlermeldungToo many open files
. Ich fixierte diese mit:OLD_ULIMIT=`ulimit -n`;ulimit -n 1024;tail +1 *.txt;ulimit -n $OLD_ULIMIT;
. Wo 1024 groß genug war für mich.-n +1
option! Eine alternative:head -n-0 file1 file2 file3
.-n
und+1
wie in-n+1
.tail -n +1 *
war genau das war ich gesucht hatte, danke!ls | xargs tail -n +1
sollte auch funktionieren.sudo ulimit -n 1024; find -f . -name "*.rb" | xargs tail -n+1 > ./source_ruby.txt
Ich grep verwendet für etwas ähnliches:
Es nicht geben Ihnen einen 'header', aber Präfixe jede Zeile mit dem Dateinamen.
*.txt
erweitert, um nur eine Datei. In diesem Zusammenhang empfehle ichgrep '' /dev/null *.txt
grep
wird nur drucken, Datei-Header, falls es mehr als eine Datei. Wenn Sie möchten, stellen Sie sicher, drucken Sie die Datei Pfad immer, nutzen-H
. Wenn Sie nicht möchten, dass die Kopfzeilen verwenden-h
. Beachten Sie auch, gibt es(standard input)
für STDIN.ag
(the silver searcher): standardmäßigag . *.txt
Präfixe jeder Datei mit seinem Namen, und jede Zeile mit Ihrer Nummer.(cd /var/log; grep "" */*.log)
. Dies druckt die Namen relativ zu/var/log
-n
zu grep wird auch eine Linie zahlen, die können Sie einfach schreiben linters mit dem ausarbeiten könnte aufgegriffen werden, indem, z.B. emacs.Sollte dies der trick:
Bedeutet:
Sie weiter verbinden kann, sucht Trog booleschen Operatoren wie
-and
oder-or
.find -ls
ist auch schön.-print
Anleitung-print
nicht drucken Sie die Datei vor dercat
.-printf
an die Ausgabe anpassen. Zum Beispiel:find *.conf -type f -printf '\n==> %p <==\n' -exec cat {} \;
entsprechend die Ausgabe vontail -n +1 *
brew install findutils
und verwenden Sie danngfind
stattfind
.cat
aus den GNU coreutils 8.22 nicht enthalten sind die header standardmäßig, und scheint nicht zu haben eine option dafür. Kombinieren Sie Ihrefind
syntax mit DS.'s Antwort, den Befehlfind . -type f -name file* -exec tail -n +1 {} +;
genau funktioniert.find
können mehrere-exec
s:find -name '*.conf' -exec printf '\n\e[33;1m%s\e[0m\n' {} \; -exec cat {} \;
Dies sollte den trick tun:
oder tun Sie dies für alle text-Dateien rekursiv:
$0
ist die gesamte Linie, so dass Sie tatsächlich bekommen habe wiederholenden Spalten drin...for
in der bash ist eher dumm und spaltet auf alle whitespace-Zeichen.Diese drucken wird der vollständige Dateiname (einschließlich Pfad), dann wird der Inhalt der Datei. Es ist auch sehr flexibel, so können Sie -name "expr" für den Befehl "suchen", und führen Sie so viele Befehle, wie Sie auf die Dateien.
grep
. Zu verwenden mitbash
:find . -type f -print | grep PATTERN | xargs -n 1 -I {} -i bash -c 'echo ==== {} ====; cat {}; echo'
Hatte ich eine Reihe von Dateien, endete in stats.txt ich wollte, dass zum verketten mit dem Dateinamen.
Ich habe die folgenden und wenn es mehr als eine Datei, die "mehr" - Befehl enthält den Dateinamen als Kopfzeile.
oder für einen Allgemeinen Fall
more <FILES> | cat
Dies ist, wie ich normalerweise behandeln die Formatierung so:
Ich in der Regel leiten Sie die Katze in einen grep nach bestimmten Informationen.
for i in *
nicht Unterverzeichnisse enthalten.Ich mag diese option
Ausgabe sieht wie folgt aus:
können Sie mit diesem einfachen Befehl statt mit einer for-Schleife,
Hier ist eine wirklich einfache Art und Weise. Sie sagten, Sie wollen die Katze, was bedeutet, Sie wollen, um die gesamte Datei anzuzeigen. Aber Sie müssen auch die Dateinamen gedruckt.
Versuchen, diese
head -n99999999 *
oderhead -n99999999 file1.txt file2.txt file3.txt
Hoffe, das hilft
head -n -0 file.txt file2.txt file3.txt
. Werke fürhead
in GNU coreutilsWenn Sie wie Farben, versuchen Sie dies:
oder:
oder: (mit Paket "multitail' installiert)
find . -type f -name "*.txt" | xargs -I {} bash -c "echo $'\e[33;1m'{}$'\e[0m';cat {}"
Diese Methode wird gedruckt, mit dem Namen und dann der Datei-Inhalt:
Ausgabe:
-f
ist nützlich, wenn Sie Sie verfolgen möchten eine Datei, die geschrieben, aber nicht wirklich im Rahmen dessen, was der OP gefragt.Wenn Sie Sie ersetzen möchten diese hässlichen ==> <== mit etwas anderem
Erklärung:
tail -n +1 *.txt
- Ausgabe alle Dateien in Ordner mit headersed -e 's/==>/\n###/g' -e 's/<==/###/g'
- ersetzen==>
mit neue Zeile + ### und<==
nur mit ###>> "files.txt"
- ausgegeben werden alle in eine DateiWenn Sie möchten, dass das Ergebnis in der gleichen Form wie das gewünschte Ergebnis, die Sie versuchen können:
Ergebnis:
Können Sie setzen
echo -e
vor und nach dem Schnitt, so dass Sie die Abstände zwischen den Zeilen sowie:Ergebnis:
for
Schleife durchläuft die Liste derls
Befehl führte.$ ls file{1..3}.txt
Ergebnis:file1.txt file2.txt file3.txt
jeder iteration wirdecho
die$file
string, dann ist es die Hintergrundmusik in einemcut
Befehl, wo ich.
als Feld-separator, die Pausen fileX.txt in zwei Stücke und gibt das Feld1 (Feld2 ist die txt) Der rest sollte klar sein... glomming auf diejenigen, die bereits erwähnt Kopf funktioniert für einige von uns:
Mein Bedürfnis ist das Lesen der ersten Zeile; wie bereits erwähnt, wenn Sie wollen, mehr als 10 Zeilen haben, müssen Sie zum hinzufügen von Optionen (Kopf -9999, etc).
Sorry für die Buchung eine Ableitung Kommentar; ich habe nicht genügend street cred zu kommentieren/hinzufügen um den Kommentar von jemandem.
Zur Lösung dieser Aufgaben, die ich in der Regel verwenden Sie den folgenden Befehl ein:
Es ist eine sehr bequeme Möglichkeit zum verketten von Dateien, wenn die Anzahl der Dateien Recht groß ist.
Wenn die Dateien alle den gleichen Namen oder kann ergänzt werden durch
find
, die Sie tun können (z.B.):zu finden, zeigen den Weg und die Katze jede Datei.
Und die fehlenden awk Lösung ist: