Zeige den Inhalt vieler Dateien

19

Was ist der einfachste Weg, über die Befehlszeile den Inhalt mehrerer Dateien anzuzeigen? Mein Verzeichnis sieht wie folgt aus.

./WtCgikkCFHmmuXQXp0FkZjVrnJSU64Jb9WSyZ52b
./xdIwVHnHY7dnuM9zcPDYQGZFdoVORPyMVD2IzjgM
./GZnATXO1e5Hh3Bz1bhgJjjwheIjjZqtnXR0hfOyj
./mWz7ehBNoTZmtDh8JG6sxw2lMJFwIovPzxDGECUY
./JN65F5v3RL2ilHPqNSx9N9D4lvVpqpbJ9lASd8TJ
./At9PS4y4nTiXUO0Z0USnbYkTPBla1msQRpwuruqE
./YiPyMZPCaUDZTiTczAvWII9bJrUqLXCFtH2pXEA2
./JoakdlbRFPwAvWp1d4n8RvMoyMeizCoiriL2Sn2U
./wFPWZUus8Yu7UtESGABLCoqDg36cT90USO0xuyUr
./qseI9PgV1EJfZCDyGGeVytajqG7JeX0r7eA5S1JW
./zgFJpNgXyCsaVh38aCuMGuzHwIbwSNB6rQDdh27x
./.htaccess

Jetzt möchte ich den Inhalt aller Dateien außer anzeigen .htaccess. Es könnte ungefähr so ​​aussehen:

WtCgikkCFHmmuXQXp0FkZjVrnJSU64Jb9WSyZ52b:
Contents of file WtCgikkCFHmmuXQXp0FkZjVrnJSU64Jb9WSyZ52b.

xdIwVHnHY7dnuM9zcPDYQGZFdoVORPyMVD2IzjgM:
Contents of file xdIwVHnHY7dnuM9zcPDYQGZFdoVORPyMVD2IzjgM.

[...]

Ich denke, das sollte mit einer Kombination aus find, xargs und cat machbar sein, aber ich habe nicht herausgefunden, wie. Vielen Dank für Ihre Zeit!

Znarkus
quelle

Antworten:

30

Die beiden Standardbefehle headund taileinen Header mit dem Dateinamen drucken , wenn Sie mehr als eine Datei Argument übergeben. Verwenden Sie tail -n +1(Drucken ab der ersten Zeile, dh alles), um die gesamte Datei zu drucken.

Anscheinend möchten Sie hier alle Dateien mit Ausnahme der einzelnen sehen, deren Name mit einem Punkt beginnt. Punktdateien sind unter Unix „versteckt“: Sie werden in der Standardausgabe von lsoder in einer Platzhalterübereinstimmung nicht angezeigt . So wird das Abgleichen aller nicht ausgeblendeten Dateien mit nur erledigt *.

tail -n +1 *

(Genau genommen wird tail -n +1 -- *es benötigt, wenn einer der Dateinamen mit einem -. Beginnt .)

Gilles 'SO - hör auf böse zu sein'
quelle
Kurz und bündig, danke! Wissen Sie, wo ich über den --Modifikator lesen kann ?
Znarkus
2
@Znarkus: --Das Ende von Optionen zu kennzeichnen, ist eine Konvention, die die meisten Befehle befolgen. ZB tail -n +1 -- -f -gsagt taildas -fund -gsind zu lesende Dateien (Operanden) und keine Optionen. Es ist Richtlinie 10 in der POSIX-Dienstprogramm-Syntaxrichtlinie (ein Dokument, das für Dienstprogrammschreiber bestimmt ist). Ich habe keinen Lesevorschlag für Endbenutzer, ich würde erwarten, dass ein gutes Unix-Tutorial ihn irgendwann behandelt.
Gilles 'SO- hör auf böse zu sein'
Nur eine Bemerkung, weil viele andere Antworten auf der Verwendung schlagen find, aber dann einige exec mit Druck Formatierung: Eine einfache Art und Weise zu verwenden , findund tailist: find . -type f -print0 -name "*" | xargs -0 tail -n +1 -- ( -print0und xargs -0und die --dafür sorgen , dass der Befehl auch mit Dateinamen mit Leerzeichen oder ausgehend arbeitet mit -)
IANH
14

Sie können alles in einem erledigen mit find:

$ find . -type f -not -name .htaccess -printf "\n%p\n" -exec cat {} \;

Das bedeutet find, dass alle Dateien ( -type f) im aktuellen Verzeichnis ( .) mit Ausnahme von ( -not) mit dem Namen .htaccess( -name .htaccess) gesucht werden sollen. Anschließend wird -printfeine neue Zeile gefolgt vom Dateinamen ( %p) gedruckt ( ) und dann in catder Datei ( -exec cat {} \;) ausgeführt. Das gibt Ihnen eine Ausgabe wie:

test/test3
Line 1

test/test2
Line 1

test/test1
Line 1
Line 2
Line 3

Wenn Sie dies häufig tun, ist es möglicherweise sinnvoll, es in ein Shell-Skript oder eine Funktion einzufügen. Ich habe einen Namen cats, der genau das tut:

#!/bin/bash
for filename; do
    echo "\033[32;1m$filename\033[0m"
    cat "$filename"
    echo
done

Es durchläuft jedes Dateinamenargument, druckt den Dateinamen (in Fettdruck Grün) aus und markiert dann die Datei:

Beispiel-Screenshot

Dann wäre der Befehl einfach:

$ find . -type f -not -name .htaccess -exec cats {} \+
Michael Mrozek
quelle
Der andere war kürzer, also akzeptierte das. Ausgezeichnete Antwort, danke!
Znarkus
6

Versuchen Sie Folgendes, um den Inhalt aller Dateien im aktuellen Ordner anzuzeigen:

grep -vI "\x00" -- *

und ähnlich, aber rekursiv:

grep -vIr "\x00" -- .

Das Format wäre: filename: content.

Ein ähnliches Format wie vorgeschlagen zu haben, wäre:

grep -rvl "\x00" -- * | while read file; do printf "\n\n#### $file ####\n"; cat $file; done

Randnotizen:

  • Die Verwendung von NUL ( \x00) in den obigen Beispielen verhindert die Anzeige von Binärdateien (was -Itatsächlich funktioniert, aber wir müssen immer noch ein Muster verwenden).
  • Bei Verwendung von Wildcard ( *) werden versteckte Dateien wie z .htaccess.

Siehe auch: grep: Dateiname einmal anzeigen, dann Kontext mit Zeilennummern bei Unix SE anzeigen

Kenorb
quelle
2
Normalerweise grep -r ^reicht es.
Catpnosis
2

Sie können dies verwenden:

cat $(find Directory/ -not -name *.htaccess)
Oskar
quelle
1

Wenn Sie eine Feinabstimmung vornehmen möchten und nicht zu viel Zeit mit Pipes, Finds und allem verlieren möchten (obwohl dies die leistungsstärkste Toolchain ist, die Sie jemals finden konnten)

Versuche einfach eine for-Schleife, eine Katze usw. zu benutzen.

tiktak
quelle
0

Wenn Sie es auch rekursiv drucken möchten, verwenden Sie (zum Beispiel für Dateien mit der Erweiterung .sql):

find -name "*.sql" -exec cat {} \; > all.sql
Andrade
quelle