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?

Steven Penny
la source

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.

masque binaire
la source
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 * .[^.]*
insensé
la source
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
Olvathar
la source
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".

Alan
la source
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 {} \;
Tyler Christian
la source
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.

PrashantB
la source
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.

Peter Mortensen
la source
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' {} \;
nikhilgoel1985
la source
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.

mchid
la source
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.

mYnDstrEAm
la source