Afficher le contenu de nombreux fichiers

19

À partir de la ligne de commande, quelle est la manière la plus simple d'afficher le contenu de plusieurs fichiers? Mon répertoire ressemble à ci-dessous.

./WtCgikkCFHmmuXQXp0FkZjVrnJSU64Jb9WSyZ52b
./xdIwVHnHY7dnuM9zcPDYQGZFdoVORPyMVD2IzjgM
./GZnATXO1e5Hh3Bz1bhgJjjwheIjjZqtnXR0hfOyj
./mWz7ehBNoTZmtDh8JG6sxw2lMJFwIovPzxDGECUY
./JN65F5v3RL2ilHPqNSx9N9D4lvVpqpbJ9lASd8TJ
./At9PS4y4nTiXUO0Z0USnbYkTPBla1msQRpwuruqE
./YiPyMZPCaUDZTiTczAvWII9bJrUqLXCFtH2pXEA2
./JoakdlbRFPwAvWp1d4n8RvMoyMeizCoiriL2Sn2U
./wFPWZUus8Yu7UtESGABLCoqDg36cT90USO0xuyUr
./qseI9PgV1EJfZCDyGGeVytajqG7JeX0r7eA5S1JW
./zgFJpNgXyCsaVh38aCuMGuzHwIbwSNB6rQDdh27x
./.htaccess

Maintenant, je voudrais voir le contenu de tous les fichiers sauf .htaccess. Cela pourrait ressembler à quelque chose comme:

WtCgikkCFHmmuXQXp0FkZjVrnJSU64Jb9WSyZ52b:
Contents of file WtCgikkCFHmmuXQXp0FkZjVrnJSU64Jb9WSyZ52b.

xdIwVHnHY7dnuM9zcPDYQGZFdoVORPyMVD2IzjgM:
Contents of file xdIwVHnHY7dnuM9zcPDYQGZFdoVORPyMVD2IzjgM.

[...]

Je pense que cela devrait être faisable avec une combinaison de find, xargs et cat, mais je n'ai pas compris comment. Merci pour votre temps!

Znarkus
la source
stackoverflow.com/questions/5917413/…
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件

Réponses:

30

Les deux commandes standard headet tailaffichent un en-tête avec le nom de fichier si vous leur passez plus d'un argument de fichier. Pour imprimer tout le fichier, utilisez tail -n +1(imprimer à partir de la première ligne, c'est-à-dire tout).

Ici, il semble que vous souhaitiez voir tous les fichiers, sauf celui dont le nom commence par un point. Les fichiers à points sont «cachés» sous unix: ils n'apparaissent pas dans la sortie par défaut lsou dans une correspondance générique. Donc, faire correspondre tous les fichiers non cachés se fait simplement *.

tail -n +1 *

(Strictement parlant, tail -n +1 -- *est nécessaire dans le cas où l'un des noms de fichier commence par a -.)

Gilles 'SO- arrête d'être méchant'
la source
Court et doux, merci! Savez-vous où je peux lire sur le --modificateur?
Znarkus
2
@Znarkus: --signifier la fin des options est une convention à laquelle obéissent la plupart des commandes. Par exemple, tail -n +1 -- -f -gindique tailque -fet -gsont des fichiers à lire (opérandes) et non des options. Il s'agit de la directive 10 dans la directive de syntaxe de l'utilitaire POSIX (un document destiné aux rédacteurs d'utilitaires). Je n'ai pas de suggestion de lecture destinée aux utilisateurs finaux, je m'attends à ce qu'un bon tutoriel Unix le couvre à un moment donné.
Gilles 'SO- arrête d'être méchant'
Juste une remarque, parce que beaucoup d' autres réponses proposent d'utiliser find, mais ensuite utiliser certains exec avec impression formatage: Une façon simple à utiliser findet tailest: find . -type f -print0 -name "*" | xargs -0 tail -n +1 -- ( -print0et xargs -0et --veiller à ce que la commande fonctionne également avec les noms de fichiers avec des espaces ou en commençant par -)
IanH
14

Vous pouvez tout faire en un avec find:

$ find . -type f -not -name .htaccess -printf "\n%p\n" -exec cat {} \;

Cela indique findde trouver tous les fichiers ( -type f) dans le répertoire courant ( .) sauf ( -not) celui nommé .htaccess( -name .htaccess). Ensuite, il affiche ( -printf) une nouvelle ligne suivie du nom de fichier ( %p), puis s'exécute catsur le fichier ( -exec cat {} \;). Cela vous donnera une sortie comme:

test/test3
Line 1

test/test2
Line 1

test/test1
Line 1
Line 2
Line 3

Si vous le faites souvent, cela peut valoir la peine de le coller dans un script shell ou une fonction; J'en ai un nommé catsqui fait exactement cela:

#!/bin/bash
for filename; do
    echo "\033[32;1m$filename\033[0m"
    cat "$filename"
    echo
done

Il boucle sur chaque argument de nom de fichier, imprime le nom de fichier (en vert gras), puis cat le fichier:

Exemple de capture d'écran

Alors la commande serait juste:

$ find . -type f -not -name .htaccess -exec cats {} \+
Michael Mrozek
la source
L'autre était plus court, donc accepté. Excellente réponse cependant, merci!
Znarkus
6

Pour afficher le contenu de tous les fichiers du dossier actuel, essayez:

grep -vI "\x00" -- *

et similaire, mais récursivement:

grep -vIr "\x00" -- .

Le format serait: filename: content.

Pour avoir un format similaire à celui suggéré, ce serait:

grep -rvl "\x00" -- * | while read file; do printf "\n\n#### $file ####\n"; cat $file; done

Notes annexes:

  • L'utilisation de NUL ( \x00) dans les exemples ci-dessus empêche d'afficher les fichiers binaires (ce qui -Iest effectivement le cas, mais nous devons toujours utiliser un modèle).
  • À l'aide de caractères génériques ( *), il ignore automatiquement les fichiers cachés tels que .htaccess.

Voir aussi: grep: afficher le nom de fichier une fois, puis afficher le contexte avec les numéros de ligne sous Unix SE

kenorb
la source
2
grep -r ^Est généralement suffisant.
catpnose
2

Vous pouvez utiliser ceci:

cat $(find Directory/ -not -name *.htaccess)
Oskar
la source
1

Si vous voulez affiner et ne perdez pas trop de temps avec les tuyaux, trouvez et tout (bien qu'il s'agisse de la chaîne d'outils la plus puissante que vous puissiez trouver)

essayez simplement d'utiliser une boucle for, un chat, etc.

TIC Tac
la source
0

Si vous souhaitez aussi l'imprimer récursivement (pour les fichiers avec l'extension .sql par exemple):

find -name "*.sql" -exec cat {} \; > all.sql
Andrade
la source