Oui, vous pouvez grep
/dev/sda1
et /proc
vous ne voulez probablement pas. Plus en détail:
Oui, vous pouvez exécuter grep le contenu binaire de /dev/sda1
. Mais, avec les grands disques durs modernes, cela prendra très longtemps et le résultat ne sera probablement pas utile.
Oui, vous pouvez saisir le contenu de /proc
mais sachez que la mémoire de votre ordinateur y est mappée sous forme de fichiers. Sur un ordinateur moderne avec des gigaoctets de RAM, cela prendra beaucoup de temps à grep et, encore une fois, le résultat ne sera probablement pas utile.
Par exception, si vous recherchez des données sur un disque dur avec un système de fichiers endommagé, vous pouvez exécuter grep something /dev/sda1
dans le cadre d'une tentative de récupération des données du fichier.
Autres fichiers problématiques dans /dev
Les disques durs et les partitions de disque dur sous /dev
peuvent être, si l'on a assez de patience, grognés. D'autres fichiers (astuce chapeau: user2313067 ) peuvent cependant provoquer des problèmes:
/dev/zero
est un fichier de longueur infinie. Heureusement, grep
(au moins la version GNU) est assez intelligent pour l'ignorer:
$ grep something /dev/zero
grep: input is too large to count
/dev/random
et /dev/urandom
sont également infinis. La commande grep something /dev/random
s'exécutera indéfiniment sauf si elle grep
est signalée pour s'arrêter.
Il peut être utile de grep /dev/urandom
lors de la génération de mots de passe. Pour obtenir, par exemple, cinq caractères alphanumériques aléatoires:
$ grep --text -o '[[:alnum:]]' /dev/urandom | head -c 10
G
4
n
X
2
Ce n'est pas infini car, après avoir reçu suffisamment de caractères, head
ferme le canal provoquant la fin de grep.
Boucles infinies
"... les liens ... créent des boucles infinies lorsqu'ils sont parcourus ..."
Grep (au moins la version GNU) est assez intelligent pour ne pas le faire. Prenons deux cas:
Avec l' -r
option, grep ne suit pas les liens symboliques à moins qu'ils ne soient explicitement spécifiés sur la ligne de commande. Par conséquent, les boucles infinies ne sont pas possibles.
Avec l' -R
option grep - t suivre les liens symboliques , mais il les vérifie et refuse de se coincer dans une boucle. Pour illustrer:
$ mkdir a
$ ln -s ../ a/b
$ grep -R something .
grep: warning: ./a/b: recursive directory loop
Exclusion des répertoires problématiques de grep -r
En grep
passant , fournit une fonction limitée pour empêcher grep de rechercher certains fichiers ou répertoires. Par exemple, vous pouvez exclure tous les répertoires nommés proc
, sys
et dev
de la recherche récursive grep avec:
grep --exclude-dir proc --exclude-dir sys --exclude-dir dev -r something /
Alternativement, nous pouvons exclure proc
, sys
et dev
utiliser les globs étendus de bash:
shopt -s extglob
grep -r something /!(proc|sys|dev)
grep
recherche dans un fichier/proc
qui mène à la mémoire mappée, peut-il arriver quigrep
frappe un EOF dans la mémoire (aléatoire) et interprète les données suivantes comme un nouveau nom de fichier à rechercher? J'ai commencé à lire legrep
code source, mais je suppose que je n'y verrai pas trop./dev
peut bien ne jamais se terminer lorsque grep commence à scanner/dev/zero
ou similaire. Je ne sais pas si de tels fichiers existent dans/proc
ou/sys
./dev/zero
, il cherchera/dev/random
pour toujours à moins qu'il ne soit arrêté. Réponse mise à jour.