Comment rechercher un mot dans tout le contenu d'un répertoire sous Linux


15

besoin de rechercher quelque chose dans tout le contenu

J'essaie:

find . | xargs grep word

Je reçois une erreur:

xargs: citation non terminée

Comment y parvenir?

Réponses:


15

xargsattend une entrée dans un format qu'aucune autre commande ne produit, il est donc difficile de l'utiliser efficacement. Ce qui ne va pas ici, c'est que vous avez un fichier dont le nom doit être cité en entrée xargs(contenant probablement un ').

Si votre grep prend en charge l' option -rou -Rpour la recherche récursive, utilisez-la.

grep -r word .

Sinon, utilisez le -execprimaire de find. C'est la manière habituelle d'obtenir le même effet que xargs, sauf sans contraintes sur les noms de fichiers. Des versions raisonnablement récentes de findvous permettent de regrouper plusieurs fichiers en un seul appel à la commande auxiliaire. Passer /dev/nullà grepgarantit qu'il affichera le nom du fichier devant chaque correspondance, même s'il est appelé sur un seul fichier.

find . -type f -exec grep word /dev/null {} +

Les versions plus anciennes de find(sur des systèmes plus anciens ou OpenBSD, ou des utilitaires réduits tels que BusyBox) ne peuvent appeler la commande auxiliaire que sur un fichier à la fois.

find . -type f -exec grep word /dev/null {} \;

Certaines versions de findet xargsont des extensions qui leur permettent de communiquer correctement, en utilisant des caractères nuls pour séparer les noms de fichiers afin qu'aucune citation ne soit requise. De nos jours, seul OpenBSD a cette fonctionnalité sans l'avoir -exec … {} +.

find . -type f -print0 | xargs -0 grep word /dev/null

+1 spécialement pour /dev/null. C'est une nuisance lorsque le format de sortie peut varier, en fonction du nombre de fichiers correspondants ... merci.
Peter.O

12

Je suppose que tu veux dire la première option

grep récursif, pour rechercher du contenu dans des fichiers

grep -R "content_to_search" /path/to/directory

ls récursif, pour rechercher des fichiers qui correspondent

ls -lR | grep "your_search"

grep -rin pour recursive-case_insensitive-show_line_number

Je veux pouvoir rechercher dans le contenu de chaque fichier.

le premier retourne toute occurrence dans n'importe quel fichier, en spécifiant le fichier où l'occurrence a été trouvée

2

Si vous avez les outils GNU (ce que vous faites si la balise Linux est précise), vous pouvez utiliser -print0et -0contourner les problèmes de citation habituels:

find . -type f -print0 | xargs -0 grep word

0

Il existe également un accusé de réception , il est conçu pour ignorer les répertoires spéciaux tels que .svn, .gitet autres. C'est un outil quotidien pour les développeurs.

C'est assez proche de pour les commutateurs communs.

Ex. :

ack -r string .

Package ack-grepsur Debian et likes Debian.



-1

Je pense que vous voulez trouver une chaîne dans les fichiers

Essayer find . -name "*" | xargs grep -l "string"


Le message d'erreur de xargs ("citation non terminée") signifie que l'OP contient un fichier. qui a une citation dans son nom. Votre ligne coassera également à ce sujet. Comme mu l'a noté, vous avez besoin d'une terminaison différente.
thiton
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.