web-dev-qa-db-fra.com

Comment rechercher du texte dans tout le système de fichiers?

En supposant que l'outil grep devrait être utilisé, je voudrais rechercher la chaîne de texte "800x600" dans tout le système de fichiers.

J'ai essayé:

grep -r 800x600 /

mais ça ne marche pas.

Ce que je crois que ma commande devrait faire est grep récursivement à travers tous les fichiers/dossiers sous root pour le texte "800x600" et liste les résultats de la recherche.

Qu'est-ce que je fais mal?

56
Level1Coder

J'utilise normalement ce style de commande pour exécuter grep sur un certain nombre de fichiers:

find / -xdev -type f -print0 | xargs -0 grep -H "800x600"

En fait, cela fait une liste de tous les fichiers du système, puis pour chaque fichier, exécutez grep avec les arguments donnés et le nom de chaque fichier.

Le -xdev L'argument indique qu'il doit ignorer les autres systèmes de fichiers - c'est bon pour éviter les systèmes de fichiers spéciaux tels que /proc. Cependant, il ignorera également les systèmes de fichiers normaux - donc si, par exemple, votre dossier/home se trouve sur une partition différente, il ne sera pas recherché - vous devrez dire find / /home -xdev ....

-type f signifie recherche de fichiers uniquement, donc les répertoires, périphériques et autres fichiers spéciaux sont ignorés (il recursera toujours dans les répertoires et exécutera grep sur les fichiers qu'il contient - il n'exécutera tout simplement pas grep sur le répertoire lui-même, ce qui ne fonctionnerait pas de toute façon). Et le -H l'option to grep lui indique de toujours afficher le nom du fichier dans sa sortie.

find accepte toutes sortes d'options pour filtrer la liste des fichiers. Par exemple, -name '*.txt' traite uniquement les fichiers se terminant par .txt. -size -2M signifie des fichiers inférieurs à 2 mégaoctets. -mtime -5 signifie les fichiers modifiés au cours des cinq derniers jours. Joignez-les avec -a pour et et -o pour o, et utilisez '(' parenthèses ')' pour regrouper les expressions (entre guillemets pour empêcher le shell de les interpréter). Ainsi, par exemple:

find / -xdev '(' -type f -a -name '*.txt' -a -size -2M -a -mtime -5 ')' -print0 | xargs -0 grep -H "800x600"

Jeter un coup d'œil à man find pour voir la liste complète des filtres possibles.

68
Richard Downer

Normalement, vous ne voudriez pas rechercher TOUT sur le système. Linux utilise des nœuds de fichiers pour tout, donc certains "fichiers" ne sont pas des choses que vous voudriez rechercher. Par exemple /dev/sda est le périphérique de blocage physique de votre premier disque dur. Vous souhaitez probablement rechercher les systèmes de fichiers montés et non le périphérique de disque brut. Il y a aussi /dev/random qui crache des données aléatoires chaque fois que vous les lisez. Une recherche qui n'a pas beaucoup de sens. Le /proc le système de fichiers est également problématique dans votre cas.

Je recommanderais l'une des deux choses.

  1. Ne cherchez pas à la racine, recherchez uniquement les endroits qui pourraient être utiles. Chercher /home ou /usr ou /etc séparément. Les informations que vous recherchez sont probablement d'un type spécifique, elles sont donc susceptibles de se trouver de toute façon dans un dossier spécifique. Les paramètres de configuration doivent être dans /etc. Vos fichiers de données personnelles doivent être dans /home. Limiter la recherche à une zone majeure comme celle-ci réduira considérablement vos problèmes de greps récursifs.

  2. Exclure les zones problématiques à l'aide de --exclude-dir et un ensemble de choses dont vous savez que vous n'avez pas besoin comme ceci:
    grep -r --exclude-dir /proc --exclude-dir /dev --exclude-dir /tmp --exclude-dir /lost+found

Enfin, il n'est pas rare de rencontrer quelques erreurs "d'autorisation refusée" lors d'un gros grep récursif. Dans le cours normal de l'utilisation, il est possible que certains utilisateurs ne puissent pas lire les fichiers. Tant qu'il ne s'agit que de quelques fichiers impairs et non d'éléments comme le périphérique brut de vos disques durs ou l'ensemble du système de fichiers proc, il est normal d'ignorer les erreurs. En fait, vous pouvez le faire sur la ligne de commande en envoyant toutes les erreurs dans Never Never Land:

grep -r search_string /path 2> /dev/null
15
Caleb

Pour plus de simplicité, je suggère ack-grep . Le lien montre de nombreux cas où ack-grep est une meilleure option.

À utiliser, après l'installation:

ack-grep pattern /
3
bbaja42

Une autre façon de voir les choses est la suivante:

grep -r /* | grep "800x600"
2
maniat1k

* puis j'obtiens un/proc/sysrq-trigger: erreur d'entrée/sortie

Votre commande fonctionne, vous obtenez cette erreur car vous essayez d'analyser les processus en cours d'exécution pour une chaîne.

Je recommande d'exclure les répertoires système avec

grep -exclude-dir = {proc, sys} "800x600" /

0
Koffee