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
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.
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.
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.
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
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.
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
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.
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
vous pouvez utiliser cette commande simple au lieu d'utiliser une boucle "for",
ls -ltr | awk '{print }' | xargs head
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
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 *
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 ...
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
- 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.
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.
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