En supposant que l'outil grep soit utilisé, j'aimerais 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, c’est grep de manière récursive dans tous les fichiers / dossiers de la racine du texte "800x600" et répertorier les résultats de la recherche.
Qu'est-ce que je fais mal?
Permission denied
erreurs? L'avez-vous exécuté en tant qu'utilisateur root ou utilisateur normal?grep -r 800x600 / 2>/dev/null
. Vous pouvez également essayer de l'exécuter en tant que root.Réponses:
J'utilise normalement ce style de commande pour exécuter
grep
plusieurs fichiers:Cela permet en réalité de répertorier tous les fichiers du système, puis de les exécuter
grep
avec les arguments donnés et le nom de chaque fichier.L'
-xdev
argument indique à find qu'il doit ignorer les autres systèmes de fichiers, ce qui permet d'éviter des systèmes de fichiers spéciaux tels que/proc
. Cependant, il ignorera également les systèmes de fichiers normaux. Ainsi, si, par exemple, votre dossier / home est sur une partition différente, la recherche ne sera pas effectuée, vous devrez le préciserfind / /home -xdev ...
.-type f
signifie que la recherche de fichiers uniquement, ainsi les répertoires, les périphériques et autres fichiers spéciaux sont ignorés (il restera toujours dans les répertoires et sera exécutégrep
sur les fichiers qu'il contient - il ne sera tout simplement pas exécutégrep
sur le répertoire lui-même, ce qui ne fonctionnerait pas de toute façon). Et l'-H
option luigrep
dit de toujours imprimer 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 que les fichiers sont plus petits que 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 ou , et utilisez des'('
parenthèses')'
pour regrouper les expressions (entre guillemets pour empêcher le shell de les interpréter). Donc par exemple:Consultez
man find
la liste complète des filtres possibles.la source
-xdev
cela exclura tous les autres systèmes de fichiers, pas seulement les spéciaux. (par exemple, si vous avez/home
monté une partition séparée, la recherche ne sera pas effectuée.)find: paths must precede expression: /
xargs
avec peut-être une plus grande efficacité en agissantfind / -xdev -type f -exec grep -H '800x600' +
.+
signe à la fin de lafind
commande fait la même chose quexargs
: il génère ungrep
processus avec plusieurs arguments.Normalement, vous ne voudriez pas réellement rechercher TOUT sur le système. Linux utilise pour tout le contenu des nœuds de fichiers, de sorte que certains "fichiers" ne sont pas des objets dans lesquels vous souhaitez effectuer une recherche. Par exemple,
/dev/sda
le périphérique de blocage physique de votre premier disque dur. Vous souhaiterez probablement effectuer une recherche dans les systèmes de fichiers montés et non dans le périphérique de disque brut. En outre, il existe/dev/random
des données aléatoires à chaque fois que vous les lisez. Rechercher cela n'a pas beaucoup de sens. Le/proc
système de fichiers est également problématique dans votre cas.Je recommanderais l'une des deux choses.
Ne cherchez pas à la racine, cherchez seulement les endroits qui pourraient vous être utiles. Rechercher
/home
ou/usr
ou/etc
séparément. Les informations que vous recherchez sont susceptibles d'un type spécifique, elles sont donc susceptibles de se trouver dans un dossier spécifique. Les paramètres de configuration doivent être dans/etc
. Vos fichiers de données personnelles doivent être dans/home
. En limitant la recherche à un domaine majeur comme celui-ci, vous réduirez considérablement vos problèmes avec les greps récursifs.Excluez les zones problématiques en utilisant
--exclude-dir
et un ensemble de choses que vous savez dont 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 de type «autorisation refusée» lors de l'exécution d'un grand grep récursif. Dans le cours normal de l’utilisation, il est possible que certains utilisateurs ne puissent pas lire certains 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, vous pouvez ignorer simplement les erreurs. En fait, vous pouvez le faire sur la ligne de commande en envoyant toutes les erreurs dans Never Never Never:
la source
-I
exclure les binairesPour plus de simplicité, je suggérerais ack-grep . Le lien montre de nombreux cas où
ack-grep
est une meilleure option.Pour utiliser est, après l'installation:
la source
Une autre façon de voir les choses est la suivante:
la source
* alors 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 pour rechercher une chaîne.
Je recommande d'exclure les répertoires système avec
grep -exclude-dir = {proc, sys} "800x600" /
la source
tout simplement à droite
-Quel est le problème dans votre commande actuelle, les guillemets, "". Toujours mettre l'argument de chaîne
grep
entre guillemets.la source
grep
. Essayez et vous verrez. Placez la chaîne "800x600" dans un fichier, puisgrep 800x600 file
vous verrez que cela fonctionne correctement. Le PO a évidemment un autre problème.