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:
.txt
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.