cat plusieurs fichiers, mais inclure le nom du fichier comme en-têtes

je voudrais concaténer plusieurs fichiers texte dans un seul gros fichier dans le terminal. Je sais que je peux le faire en utilisant la commande cat. Cependant, je voudrais que le nom de chaque fichier pour précéder le "vidage des données" pour ce fichier. Quelqu'un sait comment faire cela?

ce que j'ai actuellement:

file1.txt = bluemoongoodbeer

file2.txt = awesomepossum

file3.txt = hownowbrowncow

cat file1.txt file2.txt file3.txt

sortie désirée:

file1

bluemoongoodbeer

file2

awesomepossum

file3

hownowbrowncow
269
demandé sur Ryan 2011-05-07 01:55:42

17 réponses

cherchait la même chose, et a trouvé cela à suggérer:

tail -n +1 file1.txt file2.txt file3.txt

sortie:

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

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

==> file3.txt <==
<contents of file3.txt>

S'il n'existe qu'un seul fichier, puis l'en-tête ne sera pas imprimé. Si vous utilisez GNU utils, vous pouvez utiliser -v pour toujours imprimer un en-tête.

387
répondu DS. 2018-05-02 16:31:32

j'ai utilisé grep pour quelque chose de similaire:

grep "" *.txt

il ne vous donne pas un "en-tête", mais préfixe chaque ligne avec le nom du fichier.

148
répondu Theo 2012-08-30 10:00:14

Cela devrait faire l'affaire ainsi:

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

signifie:

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

vous pouvez également combiner les recherches avec des opérateurs booléens comme -and ou -or . find -ls , c'est bien aussi.

82
répondu Maxim_united 2016-09-04 19:57:45

Cela devrait faire l'affaire:

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

ou pour faire cela pour tous les fichiers texte récursivement:

find . -type f -name '*.txt' -print | while read filename; do
    echo "$filename"
    cat "$filename"
done > output.txt
21
répondu Chris Eberle 2011-05-06 22:46:15
find . -type f -print0 | xargs -0 -I % sh -c 'echo %; cat %'

affichera le nom complet du fichier (y compris le chemin), puis le contenu du fichier. Il est également très flexible, vous pouvez utiliser le nom de "expr" pour la commande rechercher et exécuter autant de commandes que vous le souhaitez sur les fichiers.

15
répondu kevinf 2012-05-11 15:13:45

j'avais une série de fichiers qui se terminaient en statistiques.txt que je voulais concaténer avec les noms de fichiers.

j'ai fait ce qui suit et quand il y a plus d'un fichier, la commande" Plus " inclut le nom du fichier comme en-tête.

more *stats.txt > stats.txt

ou pour un cas général

more FILES_TO_CONCAT > OUTPUT_FILE
13
répondu Steinfadt 2012-06-13 06:38:49

c'est comme ça que je gère normalement le formatage comme ça:

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

j'insère généralement le chat dans un grep pour obtenir des informations spécifiques.

4
répondu MorpheousMarty 2013-01-16 12:19:09

j'aime cette option

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

ressemble à ceci:

./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
répondu ch3ll0v3k 2017-08-02 15:50:37

vous pouvez utiliser cette commande simple au lieu d'utiliser une boucle "for",

ls -ltr | awk '{print }' | xargs head
3
répondu Gagan 2012-10-28 10:43:55

Voici une façon très simple. Vous avez dit que vous voulez cat, ce qui implique que vous voulez voir le dossier entier. Mais vous devez également imprimer le nom du fichier.

Essayez cette

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

L'espoir qui aide

2
répondu Trey Brister 2012-03-04 18:40:43

si vous aimez les couleurs, essayez ceci:

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

ou:

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

ou: (avec le paquet 'multitail' installé)

multitail *
2
répondu sjas 2017-04-24 13:44:34

cette méthode permet d'imprimer le nom du fichier, puis le contenu du fichier:

tail -f file1.txt file2.txt

sortie:

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

==> file2.txt <==
contents of file2.txt ...
contents of file2.txt ...
1
répondu serenesat 2015-04-13 09:57:26
find . -type f -exec cat {} \; -print
0
répondu user5689319 2015-12-17 04:24:42

si vous voulez le résultat dans le même format que votre sortie désirée vous pouvez essayer:

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

résultat:

file1
bluemoongoodbeer
file2
awesomepossum
file3
hownowbrowncow

vous pouvez mettre echo -e avant et après la coupe ainsi vous avez l'espacement entre les lignes aussi bien:

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

résultat:

file1

bluemoongoodbeer

file2

awesomepossum

file3

hownowbrowncow
0
répondu Fekete Sumér 2016-02-01 12:50:45
  • AIX 7.1 ksh

... glomming sur ceux qui ont déjà vu le tête fonctionne pour certains d'entre nous:

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

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

==> file3.txt <==
zzz
$

mon besoin est de lire la première ligne; comme noté, si vous voulez plus de 10 lignes, vous devrez ajouter des options (tête -9999, etc).

Désolé d'avoir posté un commentaire dérivé; Je n'ai pas assez de crédibilité pour commenter/ajouter au commentaire de quelqu'un.

0
répondu JustinKaisse 2016-03-21 15:46:30

pour résoudre ces tâches, j'utilise habituellement la commande suivante:

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

C'est un moyen très pratique pour concaténer des fichiers si le nombre de fichiers est assez grand.

0
répondu Igor 2018-04-15 09:08:45

Si vous voulez remplacer les horribles ==> <== avec quelque chose d'autre

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

explication:

tail -n +1 *.txt - sortie tous les fichiers dans le dossier avec en-tête

sed -e 's/==>/\n###/g' -e 's/<==/###/g' - remplacer ==> par nouvelle ligne + ### et <== avec juste # # #

>> "files.txt" - une sortie vers un fichier

0
répondu boroboris 2018-10-04 16:51:19