227 votes

Comment canaliser la liste des fichiers renvoyés par la commande find pour afficher tous les fichiers

Je fais un find et obtient ensuite une liste de fichiers. Comment puis-je le diriger vers un autre utilitaire comme cat (afin que cat affiche le contenu de tous ces fichiers) et essentiellement besoin de grep quelque chose de ces fichiers.

377voto

kenj0418 Points 2428
  1. Tuyauterie à un autre processus (Bien que ce ne sera PAS accomplir ce que vous avez dit que vous essayez de faire):

    command1 | command2
    

    Cela permettra d'envoyer la sortie de command1 que l'entrée de la commande2

  2. -exec sur find (cela va faire ce que vous êtes désireux de le faire-mais qui est spécifique à l' find)

    find . -name '*.foo' -exec cat {} \;
    

    (Tout ce qui est entre find et -exec sont le trouver prédicats vous utilisiez déjà. {} va remplacer par le particulier fichier que vous avez trouvé dans la ligne de commande (cat {} dans ce cas); l' \; est la fin de la -exec commande.)

  3. envoyer la sortie d'un processus comme arguments de ligne de commande à un autre processus

    command2 `command1`
    

    par exemple:

    cat `find . -name '*.foo' -print`
    

    (Remarque: ces sont des CITATIONS de ne pas régulièrement des citations (en vertu de la tilde ~ sur mon clavier).) Cela permettra d'envoyer la sortie d' command1 en command2 comme arguments de ligne de commande. Notez que les noms de fichier contenant des espaces (les retours à la ligne, etc) va être décomposé en séparer les arguments.

91voto

Jonathan Leffler Points 299946
find . -print | xargs grep something

Si vous êtes sous Linux ou du GNU find et xargs, puis utilisez -print0 avec find et -0 avec xargs de gérer les noms de fichiers contenant des espaces et d'autres odd-ball personnages.

Si vous ne voulez pas les noms de fichier - juste le texte et d'y ajouter une option appropriée grep (habituellement -h à la suppression des "rubriques"). Pour garantir de manière absolue le nom de fichier est imprimé en grep (même si un seul fichier est trouvé, ou la dernière invocation de l' grep est donné seulement 1 nom de fichier), puis ajouter /dev/null de la xargs de la ligne de commande, de sorte qu'il y aura toujours au moins deux noms de fichier.

39voto

Laurence Gonsalves Points 50783

Il ya quelques façons de le faire. Le plus simple est d'utiliser des backticks:

cat `find [whatever]`

(vous pouvez aussi utiliser $() au lieu de backticks dans quelques coquilles, y compris bash)

Cela prend la sortie de trouver et met à l' cat's de la ligne de commande. Il ne fonctionne pas si find a trop de sortie (plus que ce qui peut tenir sur une ligne de commande) ou si la sortie a de caractères spéciaux ou des espaces).

Vous pouvez également utiliser finds' -exec d'action, qui exécute une commande pour chaque fichier trouvé:

find [whatever] -exec cat {} \;

Ce sera exécutée cat une fois pour chaque fichier (plutôt que d'exécuter une seule instance de chat en le passant plusieurs noms de fichiers) qui peut être inefficace et pourrait ne pas avoir le comportement que vous souhaitez pour certaines commandes (si c'est bien pour cat). La syntaxe est aussi un peu gênant. (Vous devez vous échapper le point-virgule, parce que le point-virgule est spécial pour la coquille!)

Alternativement, vous pouvez remplacer ; avec + utilisation finds'ajouter mode pour exécuter une seule instance de chat.

find [whatever] -exec cat {} +

Vous pouvez également utiliser xargs:

find [whatever] | xargs cat

xargs exécute la commande spécifiée (cat, dans ce cas), et ajoute des arguments basés sur ce qu'il lit sur l'entrée standard.

Cela permettra de briser la ligne de commande si nécessaire. C'est, si find produit trop de sortie, ça va fonctionner cat plusieurs fois. (comme le remarque à propos de -exec précédemment, il y a certaines commandes où cette séparation peut entraîner un comportement différent), Il a encore des problèmes avec des espaces dans les noms de fichiers comme xargs seulement utilise l'espace comme séparateur.

Le plus robuste méthode est ceci:

find [whatever] -print0 | xargs -0 cat

L' -print0 drapeau dit find utilisation \0 (caractère nul) délimiteurs entre les noms de fichiers, et l' -0 drapeau dit xargs à attendre de ces \0 des délimiteurs.

9voto

f00bar Points 1551

Pour ce faire (en utilisant bash) je ferais comme suit:

 cat $(find . -name '*.foo')
 

Ceci est connu sous le nom de "substitution de commande" et il supprime le saut de ligne par défaut, ce qui est vraiment pratique!

plus d'infos ici

6voto

Gandalf Points 4909

Cela me semble être un travail pour un script shell:

 for file in 'find -name *.xml'
do
   grep 'hello' file
done
 

ou quelque chose comme ça

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X