5 votes

Terminal : grep recursive - ne pas chercher dans le contenu des liens symboliques

Lors d'une recherche avec grep -r il évite par défaut de suivre les liens symboliques. C'est vrai pour les répertoires, mais grep inspecte toujours le contenu de fichiers qui sont des liens symboliques.

Par exemple, si j'ai un cadre avec la structure suivante :

+-- MyFancy.framework
    +-- MyFancy              (symlink to ./Versions/A/MyFancy)
    +-- Versions
        +-- A
            +-- MyFancy      (the actual binary file)
        +-- Current
            +-- MyFancy      (symlink to ../A/MyFancy)

grep -r "string" MyFancy.framework des empreintes :

Binary file ./MyFancy matches
Binary file ./Versions/A/MyFancy matches
Binary file ./Versions/Current/MyFancy matches

La recherche dans ces structures est donc trois fois plus lente.

Comment puis-je faire grep exclure les liens symboliques ?

3voto

Jesus H Points 121

MacOS est livré avec BSD grep qui ne semble pas supporter un moyen d'ignorer les liens symboliques. Vous pouvez installer GNU grep. Exécutez-le avec l'option 'r' et il ignorera les liens symboliques.

# Install GNU grep
brew install grep

# Run GNU grep, ignore symlinks.
# Brew doesn't replace system grep, GNU grep needs to be called with 2 g's.
ggrep -rl mypattern

# Run GNU grep, follow symlinks
ggrep -Rl mypattern

2voto

user3439894 Points 52496

Si vous regardez le page de manuel pour grep il n'y a pas de option d'exclure liens symétriques et il faudra donc appliquer une autre méthode. L'une de ces méthodes consiste à utiliser find pour ne produire que noms de fichiers en utilisant le -type t optiont est réglé sur f pour fichier régulier .

Exemple :

 find . -type f -exec grep -l 'search' {} \; 

'search' est ce que vous êtes grep pour, et le sortie sera le chemin relatif nom de fichier de la fichier(s) le contenant en raison de l'utilisation -l avec grep .

Dans l'exemple ci-dessus, grep sera exécuté pour chaque chemin relatif nom de fichier que find passe à
-exec . Comme grep peut gérer plusieurs noms de fichiers vous pouvez modifier le ; à la fin de l'année commande à + pour dire find pour passer toutes les correspondances noms de fichiers à grep en même temps. Notez que si le nombre de noms de fichiers correspondants est important, alors la longueur autorisée de la balise ligne de commande pourrait être dépassée.

Notez également que find dispose d'un ensemble assez large de options et vous pourrez ainsi réduire le nombre d'options de recherche. sortie passé grep en fonction de vos besoins.

LesApples.com

LesApples est une communauté de Apple où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres utilisateurs d'appareils Apple, poser vos propres questions ou résoudre celles des autres.

Powered by:

X