Comment puis-je grep des fichiers cachés?


96

Je recherche dans un référentiel Git et je souhaite inclure le .gitdossier.

grep n'inclut pas ce dossier si je cours

grep -r search *

Quelle serait une commande grep pour inclure ce dossier?

Réponses:


136

Veuillez vous référer à la solution à la fin de cet article comme une meilleure alternative à ce que vous faites.

Vous pouvez explicitement inclure des fichiers cachés (un répertoire est également un fichier).

grep -r search * .*

Le *correspondra à tous les fichiers sauf ceux cachés et .*correspondra uniquement aux fichiers cachés. Cependant, cela échouera s'il n'y a aucun fichier non caché ou aucun fichier caché dans un répertoire donné. Vous pouvez bien sûr ajouter explicitement à la .gitplace de .*.

Cependant, si vous souhaitez simplement rechercher dans un répertoire donné, procédez comme suit:

grep -r search .

Le .correspondra au chemin actuel, qui comprendra à la fois les fichiers non cachés et cachés.


1
La première approche (grep -r search *. *) A fonctionné pour moi. La deuxième approche (grep -r search.) N'a pas trouvé la chaîne. J'ai trouvé des résultats similaires en omettant le "-r" et en recherchant uniquement le répertoire de niveau supérieur. J'utilise GNU grep 2.6.3.
Alan

@Alan: C'est bizarre. J'utilise cela régulièrement. L'avez-vous essayé sur le même répertoire?
bitmask

27
en utilisant .*comprendra le répertoire parent (parce que les ..matchs)
sehe

1
Est-il prudent de généraliser sur cette solution car le comportement peut varier entre les coquilles?
astletron

6
pour la première version, vous devez ajouter --exclude-dir = .. pour éviter de rechercher dans les dossiers parents
user762353

12

Je viens de rencontrer ce problème, et sur la base de la réponse de @ bitmask, voici ma simple modification pour éviter le problème signalé par @sehe:

grep -r search_string * .[^.]*

Je n'obtiens aucun résultat en utilisant ceci: sudo grep -r ANDROID_HOME * .[^.]*qu'est-ce que je fais de mal ici?
messerbill

@messerbill où lancez-vous la recherche?
insaner

3

Peut-être préférerez-vous combiner "grep" avec la commande "find" pour une solution complète comme:

find . -exec grep -Hn search {} \;

Cette commande recherchera dans les fichiers ou répertoires cachés la chaîne "recherche" et listera tous les fichiers avec une coïncidence avec ce format de sortie:

Chemin du fichier: Numéro de ligne: ligne avec coïncidence

./foo/bar:42:search line
./foo/.bar:42:search line
./.foo/bar:42:search line
./.foo/.bar:42:search line

2

Vous pouvez utiliser cette approche, en supposant que vous recherchez le répertoire actuel (sinon remplacez. Par le répertoire souhaité):

find . -type f | xargs grep search

ou si vous souhaitez simplement rechercher au niveau supérieur (ce qui est plus rapide à tester si vous les essayez):

find . -type f -maxdepth 1 | xargs grep search

MISE À JOUR: J'ai modifié les exemples en réponse aux commentaires de Scott. J'ai également ajouté "-type f".


1
(1)  ~est le répertoire personnel de l'utilisateur. La question ne concernait pas le répertoire personnel de l'utilisateur, la réponse ne devrait donc pas être mentionnée  ~. (2) Dans une  findcommande, -name '*'est un no-op (c'est-à-dire, cela ne sert à rien).
Scott

1

Pour rechercher UNIQUEMENT tous les fichiers et répertoires cachés à partir de votre emplacement actuel:

find . -name ".*" -exec grep -rs search {} \;

UNIQUEMENT tous les fichiers cachés:

find . -name ".*" -type f -exec grep -s search {} \;

UNIQUEMENT tous les répertoires cachés:

find . -name ".*" -type d -exec grep -rs search {} \;

1

Toutes les autres réponses sont meilleures. Celui-ci pourrait être facile à retenir:

find . -type f | xargs grep search

Il ne trouve que les fichiers (y compris cachés) et greps chaque fichier.


0

Pour rechercher uniquement dans un certain dossier, vous pouvez utiliser:

ls -al | grep " \."

C'est une commande très simple pour lister et rediriger vers grep.


0

En plus de la suggestion de Tyler, voici la commande pour grep tous les fichiers et dossiers de manière récursive, y compris les fichiers cachés

find . -name "*.*" -exec grep -li 'search' {} \;

0

Pour empêcher la correspondance .et ..qui ne sont pas des fichiers cachés, vous pouvez utiliser grepavec ls -Acomme dans cet exemple:

ls -A | grep "^\."

^\. déclare que le premier caractère doit être .

La -Aou --almost-alloption exclut les résultats .et ..donc qui sont adaptés les fichiers et répertoires cachés uniquement.


0

Vous pouvez également rechercher des types spécifiques de fichiers cachés, comme les fichiers de répertoire cachés:

grep -r --include=*.directory "search-string"

Cela peut fonctionner mieux que certaines des autres options. Les autres options qui ont fonctionné peuvent être trop lentes.

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.