afficher le contenu de tous les fichiers avec leurs noms de fichiers avec chat

Je ne peux pas trouver un moyen d’imprimer chaque nom de fichier avant son contenu avec cat . Voici ce que j’essaie de faire:

 raja@badfox:~/Perl/t$ ls 1.txt 2.txt 3.txt raja@badfox:~/Perl/t$ echo " I am " >> 1.txt raja@badfox:~/Perl/t$ echo " trying " >> 2.txt raja@badfox:~/Perl/t$ echo " to do this " >> 3.txt raja@badfox:~/Perl/t$ cat *.* I am trying to do this raja@badfox:~/Perl/t$ 

Dans la dernière commande, je n’ai reçu que le texte de ces fichiers, mais je veux en fait le texte avec les noms de fichiers. Je veux dire comme ça

 Filename:1.txt  Filename:2.txt  Filename:3.txt  

cat n’imprimera pas les noms de fichiers. Obtenez le shell pour le faire ou utilisez plutôt head ou tail : ils impriment le nom du fichier lorsque vous transmettez plusieurs fichiers (pas exactement dans le même format). Utilisez tail -n +1 pour imprimer le fichier entier (à partir de la ligne 1, les lignes sont numérotées à partir de 1).

 tail -n +1 -- *.txt 

Cela a été récemment discuté sur Hacker News à travers le blog 4 commandes Unix dont j’abuse chaque jour .

L’essentiel était d’utiliser ceci:

 more * | cat 

Pour obtenir ceci:

 :::::::::::::: jack.txt :::::::::::::: Once upon a time there was a fellow named Jack. :::::::::::::: lyingryan.txt :::::::::::::: Now that "sortingckle down economics" has been tested for 30 years and the data shows it has been a total failure, candidates still claim that cutting taxes for billionaires will help the economy. :::::::::::::: market.txt ::::::::::::::: Jack went to market to sell the family cow. He came back with a handful of magic beans. 

Ce qui est beaucoup plus joli qu’une boucle for ... do ... done .

Le post du blog mentionne également de nombreuses alternatives à cette approche afin d’être compatible entre différents unix, comme head -n 99999 * par rapport à head -n 0 * qui ne fonctionne que sous Linux.

 find . -name \*.txt -print -exec cat {} \; 
 $ for f in *; do echo "Filename: $f"; cat "$f"; done Filename: 1.txt I am Filename: 2.txt trying Filename: 3.txt to do this 

Vous pouvez y arriver par exemple avec

 ls -1 *.txt | xargs -I % sh -c "echo % ; cat %" 

simplement:

  • pour chaque fichier .txt
  • lance la commande echo filename ; cat filename echo filename ; cat filename (le % est un motif de remplacement défini par -I )

Vous pouvez aussi abuser un peu de grep pour atteindre cet objective:

 grep -r '.*' *.txt 

Pour obtenir les numéros de ligne, vous pouvez

 grep -rn '.*' *.txt 

Au-dessus de grep, on cherche juste quelque chose. Si vous n’êtes pas intéressé par les lignes vides, vous pouvez même simplifier:

 grep -r . *txt 

De plus, le commutateur -r grep fait fonctionner grep de manière récursive, vous pouvez donc

 grep -r . . 

pour répertorier le contenu de tous les fichiers de vos répertoires actuels.

[EDIT] Inconvénient: il est lent, donc pour un grand nombre de fichiers, je ne l’utilise pas.