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?


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"

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 "[!.]*"

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.


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).


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.


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.


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 .


1

Pour trouver des fichiers cachés:

find -name '[.]*'

Pour trouver des fichiers visibles:

find -name '[!.]*'

C'est aussi simple que ça.

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.