Comment exclure / ignorer les fichiers et répertoires cachés dans une recherche "find" avec joker?

97

À partir de (notez les caractères avant et après "du texte")

find . -type f -name '*some text*'

comment peut-on exclure / ignorer tous les fichiers et répertoires cachés?

J'ai déjà été googling pendant beaucoup trop longtemps , est tombé sur certains -prune et! (point d'exclamation) paramètres, mais aucun exemple (et parcimonieux) exemple qui a juste fonctionné .

Piping | à grep serait une option et je serais également heureux de vous en donner des exemples. mais principalement Je suis intéressé par une brève présentation (ou par un simple doublage, illustrant différentes façons d’atteindre le même objectif en ligne de commande) juste en utilisant find .

ps: Rechercher des fichiers dans Linux et exclure des répertoires spécifiques semble étroitement lié, mais a) n'est pas encore accepté et b) est lié, mais différent et distinct, mais c) peut fournir de l'inspiration et aider à identifier la confusion!

Modifier

find . \( ! -regex '.*/\..*' \) -type f -name "whatever" , fonctionne. L'expression rationnelle recherche "tout, puis une barre oblique, puis un point, puis tout" (tous les fichiers et dossiers cachés, y compris leurs sous-dossiers), ainsi que le "!" nie le regex.

    
posée nutty about natty 10.03.2013 - 12:58
la source

6 réponses

3

La réponse que j'ai initialement publiée en tant que "modification" de ma question initiale ci-dessus:

find . \( ! -regex '.*/\..*' \) -type f -name "whatever" , fonctionne. L'expression rationnelle recherche "tout, puis une barre oblique, puis un point, puis tout" (tous les fichiers et dossiers cachés, y compris leurs sous-dossiers), ainsi que le "!" nie le regex.

    
réponse donnée nutty about natty 11.08.2015 - 09:31
la source
107

Ceci imprime tous les fichiers qui sont les descendants de votre répertoire, en ignorant les fichiers et répertoires masqués:

find . -not -path '*/\.*'

Donc, si vous cherchez un fichier avec some text dans son nom et que vous voulez ignorer les fichiers et répertoires masqués, exécutez:

find . -not -path '*/\.*' -type f -name '*some text*'

Explication:

L'option -path s'exécute vérifie un motif par rapport à la chaîne de chemin complète. * est un caractère générique, / est un séparateur de répertoire, \. est un point (il doit être échappé pour éviter une signification particulière) et * est un autre caractère générique. -not signifie ne pas sélectionner les fichiers correspondant à ce test.

Je ne pense pas que find soit assez intelligent pour éviter de chercher de manière récursive des répertoires cachés dans la commande précédente, donc si vous avez besoin de rapidité, utilisez plutôt -prune , comme ceci:

 find . -type d -path '*/\.*' -prune -o -not -name '.*' -type f -name '*some text*' -print
    
réponse donnée Flimm 09.07.2013 - 18:30
la source
6

Ceci est l’un des rares moyens d’exclure les fichiers de points fonctionnant également correctement sur BSD, Mac et Linux:

find "$PWD" -name ".*" -prune -o -print
  • $PWD imprime le chemin d'accès complet au répertoire en cours afin que le chemin ne commence pas par ./
  • -name ".*" -prune correspond à tous les fichiers ou répertoires qui commencent par un point, puis ne descendent pas
  • -o -print signifie que le nom du fichier est imprimé si l'expression précédente ne correspond à rien. Si vous utilisez -print ou -print0 , toutes les autres expressions ne sont pas imprimées par défaut.
réponse donnée eradman 24.03.2016 - 14:51
la source
4
find $DIR -not -path '*/\.*' -type f \( ! -iname ".*" \)

Exclut tous les répertoires masqués et les fichiers cachés sous $ DIR

    
réponse donnée guest 28.02.2014 - 01:49
la source
3

Vous n'avez pas besoin d'utiliser find pour cela. Il suffit d'utiliser globstar en shell it-self, comme:

echo **/*foo*

ou:

ls **/*foo*

**/ représente n'importe quel dossier de manière récursive et *foo* tout fichier qui a foo dans son nom.

Par défaut, ls imprimera les noms de fichiers en excluant les fichiers et répertoires cachés.

Si la globulation n’est pas activée, faites-le par shopt -s globstar .

Remarque: Une nouvelle option de globalisation fonctionne dans Bash 4, zsh et des coquilles similaires.

Exemple:

$ mkdir -vp a/b/c/d
mkdir: created directory 'a'
mkdir: created directory 'a/b'
mkdir: created directory 'a/b/c'
mkdir: created directory 'a/b/c/d'
$ touch a/b/c/d/foo a/b/c/d/bar  a/b/c/d/.foo_hidden a/b/c/d/foo_not_hidden
$ echo **/*foo*
a/b/c/d/foo  a/b/c/d/foo_not_hidden
    
réponse donnée kenorb 20.04.2015 - 11:49
la source
1

find possède des commutateurs logiques tels que -and et -not , vous pouvez les utiliser à votre avantage pour trouver un fichier correspondant avec deux règles telles que:

$ touch non_hidden_file.txt .hidden_file.txt somethings/.another_hidden_file.txt                                                 

$ find . -type f -name '*hidden_file*' -and \( -not -name ".*" \)                            
./non_hidden_file.txt

Comme vous pouvez le voir, find utilise deux règles -name '*hidden_file*' et -and \( -not -name ".*" \) pour trouver les noms de fichiers qui correspondent aux deux conditions - filename avec hidden_file mais sans point initial. Notez les barres obliques devant les parenthèses - elles sont utilisées pour définir des parenthèses sous la forme d’arguments find plutôt que de définir un sous-shell (ce que signifient les parenthèses sans barres obliques)

    
réponse donnée Sergiy Kolodyazhnyy 16.05.2017 - 00:01
la source

Lire d'autres questions sur les étiquettes