Katzendateien mit Verzeichnis

10

Gibt es einen Befehl zum Anzeigen des Verzeichnis- / Dateinamens bei Katzendateien?

Beispiel: Angenommen, zwei Dateien f1.txt und f2.txt befinden sich unter ./tmp

./tmp/f1.txt
./tmp/f2.txt 

Wenn ich dann cat ./tmp/*.txt mache , wird nur der Inhalt von Dateien angezeigt. Aber wie zeigt man zuerst den Dateinamen, dann den Inhalt? ZB:

 (The needed command):
 ./tmp/f1.txt:  
 This is from f1.txt
 and so on
 ./tmp/f1.txt:
 This is from f2.txt ...

Gibt es einen Befehl dazu? (Es scheint keine Option für 'cat' zu geben, um die Dateinamen anzuzeigen)

Gilles 'SO - hör auf böse zu sein'
quelle
1
Siehe auch Katze mit Kopf- und Zeilennummern?
Gilles 'SO - hör auf böse zu sein'

Antworten:

6
$ for file in ./tmp/*.txt; do echo "$file";  cat "$file"; done

-oder-

$ find ./tmp -maxdepth 1 -name "*.txt" -print -exec cat "{}" \;
kbulgrien
quelle
3
Das erste Beispiel wird für Dateien mit Leerzeichen unterbrochen. Sie sollten niemals versuchen, die Ausgabe von ls zu analysieren oder zu wiederholen
jordanm
17

Versuchen Sie es einfach als eine andere Idee tail -n +1 ./tmp/*.txt

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

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

==> file3.txt <==
<contents of file3.txt>
Random832
quelle
2

Sie könnten leicht ein kleines Skript schreiben, das genau das tut,

for f in "$@" do; echo "This is from $f"; cat -- "$f"; done
jpmuc
quelle
Danke, aber gibt es eine Möglichkeit, die Verwendung von Skripten zu vermeiden - mithilfe eines Befehls?
Meines Wissens gibt es keinen solchen Befehl
1
Was ist der praktische Unterschied zwischen einem Skript und einem Befehl oder warum ist es wichtig, dass mehrere Befehle in einer einzigen Befehlszeile eingegeben werden, um das Problem zu lösen? Der Befehl muss nicht in einer Datei enthalten sein. Sie können das "Skript" ausführen, indem Sie einfach den angegebenen Text eingeben.
Das ist wahr - aber ich möchte etwas Bestehendes verwenden, siehe die Antwort von "ire_and_curses" und "kbulgrien"
3
Bitte verwenden Sie "$@"stattdessen anstelle von $*, da erstere Dateinamen mit Leerzeichen behandeln (dies ist Teil der POSIX-Shell, es ist kein Bash-Ismus). Auch cat "$f".
Derobert
1
find . -name '*' -execdir cat '{}' \;

Wenn ein Verzeichnis übergeben wird cat, sehen Sie Folgendes:

cat: ./chapter_01: Is a directory

Unmittelbar danach findwird catder Inhalt dieses Verzeichnisses angezeigt.

ire_and_curses
quelle
1

Nicht genau das, wonach Sie gefragt haben, aber Sie können jeder Zeile den Dateinamen voranstellen :

$ grep ^ ./tmp/*.txt
./tmp/f1.txt: this is from f1.txt
./tmp/f1.txt: blaa, blaa, blaa...
./tmp/f1.txt: blaa, blaa, blaa...
./tmp/f2.txt: this is from f2.txt
./tmp/f2.txt: blaa, blaa, blaa...
./tmp/f2.txt: blaa, blaa, blaa...

Es wird schwierig sein, viel besser zu werden, ohne auf ein wenig Scripting zurückzugreifen.

Paul R.
quelle
1
Das ist eine gute Problemumgehung - meine Dateien sind eigentlich einzeilig.
1

cat ist (absichtlich) ein extrem einfacher Befehl, der nur einen Dateistream liest und in einen anderen kopiert (mit einigen grundlegenden Formatierungsoptionen). Es wäre ziemlich einfach, ein Dienstprogramm basierend auf cat zu erstellen, das den Dateinamen angegeben hat, aber Standardversionen tun dies nicht - wahrscheinlich, weil es einfach ist, mit anderen Befehlen zu replizieren.

Wenn Sie die Seiten manuell untersuchen möchten, können Sie "weniger" verwenden. Dies gibt Ihnen den Dateinamen am Ende jeder Datei im Format: 'foo.txt (Datei 1 von 100) (ENDE) - Weiter: bar.txt).

teppic
quelle
0
grep . *.txt 

Entspricht allen Zeilen und zeigt auch Dateinamen an

sathiq
quelle
.passt nicht zu leeren Zeilen
Evgeny Vereshchagin