Comment utiliser la commande "cat" sur la sortie de la commande "find"?

13

Je veux rediriger la sortie de la findcommande vers la catcommande pour pouvoir imprimer les données du fichier donné.

Ainsi, par exemple, si la sortie de find est /aFile/readmealors le chat doit être interprété comme cat ./aFile/readme. Comment puis-je le faire instantanément?

Dois-je utiliser des tuyaux?

J'ai essayé des versions de ceci:

cat | find ./inhere -size 1033c 2> /dev/null

Mais je suppose que c'est complètement faux? Bien sûr, je suis sûr que la sortie est un seul fichier et non plusieurs fichiers.

Alors, comment puis-je faire ça? J'ai cherché sur Google et je n'ai pas trouvé de solution, probablement parce que je n'ai pas bien cherché: P

Eksapsy
la source

Réponses:

21

Vous pouvez le faire findseul avec l' -execaction:

find /location -size 1033c -exec cat {} +

{}sera étendu aux fichiers trouvés et +nous permettra de lire autant d'arguments que possible par invocation de cat, car cat peut prendre plusieurs arguments.

Si votre findn'a pas l' +extension ou si vous souhaitez lire les fichiers un par un:

find /location -size 1033c -exec cat {} \;

Si vous souhaitez utiliser l'une des options de cat, procédez comme suit:

find /location -size 1033c -exec cat -n {} +
find /location -size 1033c -exec cat -n {} \;

Ici, j'utilise l' -noption pour obtenir les numéros de ligne.

heemayl
la source
Donc, si j'ai raison: {} est comme une variable dans laquelle est stockée la sortie de la commande find et après le signe "+", vous êtes censé écrire les paramètres cat? Non ? Edit: D'accord, vous avez édité votre message et maintenant vous venez de répondre à ma question: P Thanx man! Résolu!
Eksapsy
@ general656 Vérifiez mes modifications ..
heemayl
1
Le fait que je ne connaissais pas catde » -noption me surprend. J'adore lire des questions aléatoires.
mazunki
0

Substitution de commande

Une autre option consiste à utiliser la substitution de commande . Envelopper une commande dans $()exécutera la commande et remplacera la commande par sa sortie.

cat $(find ./inhere -size 1033c 2> /dev/null)

va devenir

cat ./inhere/file1 .inhere/file3

Cela équivaut plus ou moins à utiliser l'ancien style de commandes d'encapsulation avec des ticks arrière:

cat `find ./inhere -size 1033c 2> /dev/null`

Plus de détails sur les documents liés ci-dessus

Bash effectue l'expansion en exécutant la commande dans un environnement de sous-shell et en remplaçant la substitution de commande par la sortie standard de la commande, avec tous les retours à la ligne supprimés. Les sauts de ligne incorporés ne sont pas supprimés, mais ils peuvent être supprimés lors du fractionnement des mots. La substitution de commande $(cat file)peut être remplacée par l'équivalent mais plus rapidement $(< file).

Lorsque l'ancienne forme backquote de substitution est utilisé, conserve son sens anti - slash littéral , sauf si elle est suivie par $, `ou \. La première citation inverse non précédée d'une barre oblique inverse met fin à la substitution de commande. Lors de l'utilisation du $(command)formulaire, tous les caractères entre parenthèses constituent la commande; aucun n'est traité spécialement.

Les substitutions de commandes peuvent être imbriquées. Pour imbriquer lorsque vous utilisez le formulaire guillemets inversés, échappez aux guillemets intérieurs avec des barres obliques inverses.

Si la substitution apparaît entre guillemets, le fractionnement de mots et l'expansion de nom de fichier ne sont pas effectués sur les résultats.

Voir cette autre réponse pour quelques bons exemples d'utilisation.

WhiteHotLoveTiger
la source
Notez que si findtrouve trop de fichiers, cela générerait une erreur "liste d'arguments trop longue" en essayant d'invoquer cat. Il aurait également des problèmes de gestion des noms de fichiers contenant des espaces blancs et éventuellement des noms de fichiers contenant des caractères de remplacement de nom de fichier.
Kusalananda
-1

Cela affichera le nom et le contenu des fichiers texte (ascii) de manière récursive uniquement.

find . -type f -exec grep -Iq . {} \; -print | xargs awk 'FNR==1{print FILENAME ":" $0; }'

Encore une tentative

find . -type f -exec grep -Iq . {} \; -printf "\n%p:" -exec cat {} \;
Prashant Adlinge
la source
-2

Utilisez pipe et xargs

find /* -name pg_hba.conf | xargs cat

S'il échoue en raison d'un manque d'autorisations, vous pouvez utiliser sudo pour vous assurer que vous êtes autorisé à exécuter la commande find sur le répertoire que vous recherchez.

 sudo find /* -name pg_hba.conf | xargs sudo cat
App Work
la source
1
Et si quelqu'un a créé un fichier appelé /tmp/ /dev/urandom /pg_hba.conf, cela permettra à root de vider tout le contenu de /dev/urandom. Le pire peut probablement se faire en fonction du contexte. xargsne devrait presque jamais être utilisé sans le -0cas échéant. Aussi sudo xargsserait mieux que xargs sudo. Et ce /*serait mieux comme /.
Stéphane Chazelas
1
L'OP souhaite utiliser cat pour imprimer le contenu du fichier sur stdout. Le but est donc atteint par le chat. La question est de savoir comment utiliser cat à partir de la commande out put of find pour imprimer le contenu du fichier et non comment utiliser sudo ou find, la commande ci-dessus résout la question. Oui, xargs -0 était la seule chose constructive que vous ayez signalée. Mais n'a pas montré l'utilisation. Essayez de ne pas être impoli.
App Work
Désolé si cela vous a paru grossier. Ce n'était pas l'intention. Je voulais souligner les limites. Votre réponse montre de mauvaises pratiques ( find|xargssans -0devrait vraiment être interdite), d'où le vote négatif . La sortie de findsans -print0n'est pas post-traitable de manière fiable. -print0n'est pas standard. Cela dit, la norme sudo find / -name pg_hba.conf -exec cat {} +pourrait également vous faire vider le contenu de /dev/urandom(par exemple, si quelqu'un a créé un lien symbolique /tmp/pg_hba.confvers celui-ci et qu'il n'y a pas de moyen portable facile de contourner cela qui n'a pas au moins de condition de concurrence).
Stéphane Chazelas
1
N'utilisons pas sudo"juste au cas où", d'accord?
lindhe
Eh bien, c'est mieux que de courirsudo rm -rf /
devinbost