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.
Réponses
Trop de publicités?-
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
-
-exec
surfind
(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.) -
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
encommand2
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.
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.
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 find
s' -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 find
s'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.