Exclure les fichiers cachés lors de la recherche avec Unix / Linux find?

35

Quelles options dois-je utiliser findpour exclure les fichiers cachés?

de là
la source
4
De plus: la raison pour laquelle il n’existe pas de support spécifique pour cette tâche est que la seule particularité des fichiers nommés avec un '.' est qu'il n'y a pas de liste par lssauf si spécifiquement demandé: ce sont des fichiers complètement ordinaires à tous égards, c'est juste que lsvous pouvez les ignorer par défaut.
dmckee
2
Question: voulez-vous cacher quelque chose comme .hidden/visible.txt?
Keith Thompson

Réponses:

14

J'ai trouvé ça ici :

find . \( ! -regex '.*/\..*' \) -type f -name "whatever"
Jarvin
la source
Pourquoi pas juste \( ! -name '.*' \)?
Grawity
@grawity Je viens de trouver ça, je ne sais pas trop comment ça marche. Le vôtre cacherait-il non seulement des fichiers cachés, mais également des répertoires cachés et tous leurs sous-contenus et fichiers cachés dans des sous-dossiers?
Jarvin
5
Non, ce ne serait pas: / Mais le \( ! -path '*/.*' \)ferais.
Grawity
@grawity Ya, je suppose que j'ai supposé ce que le PO voulait ... La solution de votre nom est probablement la plus proche de ce qu'elle demandait.
Jarvin
@ grawity & Dan: N'est-ce pas (! -path '^. *') ?? vos solutions ignoreront tous les fichiers qui ont un '.' n'importe où dans le nom du fichier comme a.exe, b.out, etc.
Software Mechanic
13

Il semble que le motif de négation glob ne soit pas bien connu. Pour que vous puissiez utiliser:

find . -name "[!.]*"
point rouge
la source
12

Cela ne répond pas à votre question, mais pour la tâche de trouver des fichiers non cachés, je préfère laisser trouver tous les fichiers, puis filtrer avec grep.

find . -type f | grep -v '/\.'

Semblable à votre approche mais peut-être un peu plus simple.

Simon Chiang
la source
C’était la seule des doublures qui a fonctionné pour moi.
Envoyé
7

Essayez l' findutilisation suivante :

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

Qui ignorerait tous les fichiers cachés (fichiers et répertoires commençant par un point).

Kenorb
la source
1

J'ai écrit un script appelé findnhqui, je crois, traite certains cas extrêmes plus que les réponses à cette question que j'ai pu trouver sur le Web.

#!/bin/bash

declare -a paths

while [ $# -ne 0 ]; do
  case "$1" in -*) break ;; esac
  paths+=("$1")
  shift
done

find "${paths[@]}" \( -name . -o -name .. -o \! \( -name '.*' -prune \) \) "$@"

Par exemple, vous pouvez rechercher des fichiers et des répertoires non masqués dans un répertoire masqué explicitement spécifié à l'aide d'une commande similaire à findnh ~/.hiddendir/, qui s'affichera ~/.hiddendir/filemais ne le montrera pas ~/.hiddendir/.superhiddenfile.

Kurt Glastetter
la source
1
Beau morceau de codage. Sauf que, quand j'essaye findnh ~/.hiddendir/, je ne reçois rien. En dehors de cela, en quoi est-ce différent de ! -path '*/.*'et find … | grep -v '/\.'?
G-Man dit 'Réintégrez Monica'
1

Si votre objectif est de findet grep, ripgrepexclut les fichiers cachés par défaut, par exemple

rg --files

--files Imprimez chaque fichier qui serait recherché sans effectuer réellement la recherche.

Kenorb
la source
1

fd

Utiliser fd, une alternative simple, beaucoup plus rapide et conviviale à find. Par défaut, il:

  • Ignore les répertoires et fichiers cachés, par défaut.
  • Ignore les modèles de votre .gitignore, par défaut.

Vérifiez l' analyse de référence .

Kenorb
la source
1

Pour trouver des fichiers cachés:

find -name '[.]*'

Pour trouver des fichiers visibles:

find -name '[!.]*'

C'est aussi simple que ça.

Paul
la source