web-dev-qa-db-fra.com

Comment exclure / ignorer des fichiers et des répertoires cachés dans une recherche "trouver" avec caractères génériques?

À partir de (notez le caractères génériques 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à googlé depuis bien trop longtemps , suis tombé sur des -Prune et! paramètres (point d’exclamation), mais pas d’exemple approprié (et parcimonieux) qui vient de fonctionner .

Tuyauterie | to grep serait une option et j'aimerais également avoir des exemples. mais principalement je suis intéressé par une brève une ligne (ou deux lignes uniques, illustrant différentes manières d'atteindre le même objectif de ligne de commande) juste en utilisant find .

ps: Rechercher des fichiers sous 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 inspiration et aide. repérer la confusion!

Modifier

find . \( ! -regex '.*/\..*' \) -type f -name "whatever", fonctionne. La regex recherche "n'importe quoi, puis une barre oblique, puis un point, puis n'importe quoi" (c'est-à-dire tous les fichiers et dossiers cachés, y compris leurs sous-dossiers), et le "!" nie la regex.

114
nutty about natty

Le réponse J'ai initialement posté en tant que "modifier" ma question initiale ci-dessus:

find . \( ! -regex '.*/\..*' \) -type f -name "whatever", fonctionne. La regex recherche "n'importe quoi, puis une barre oblique, puis un point, puis n'importe quoi" (c'est-à-dire tous les fichiers et dossiers cachés, y compris leurs sous-dossiers), et le "!" nie la regex.

2
nutty about natty

Ceci affiche tous les fichiers qui sont les descendants de votre répertoire, en ignorant les fichiers et répertoires caché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 cachés, exécutez:

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

Explication:

L'option -path exécute la vérification d'un modèle par rapport à la chaîne de chemin d'accès 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 toute signification spéciale) et * est un autre caractère générique. -not signifie que vous ne sélectionnez pas les fichiers correspondant à ce test.

Je ne pense pas que find soit suffisamment intelligent pour éviter la recherche récursive de répertoires cachés dans la commande précédente. 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
126
Flimm

C’est l’un des rares moyens d’exclure les fichiers de points qui fonctionnent également correctement sous BSD, Mac et Linux:

find "$PWD" -name ".*" -Prune -o -print
  • $PWD affiche le chemin complet du répertoire actuel pour qu'il ne commence pas par ./
  • -name ".*" -Prune correspond à tous les fichiers ou répertoires commençant par un point puis ne descendant pas
  • -o -print signifie imprimer le nom du fichier si l'expression précédente ne correspond à rien. Utiliser -print ou -print0 fait que toutes les autres expressions ne s'impriment pas par défaut.
9
eradman
find $DIR -not -path '*/\.*' -type f \( ! -iname ".*" \)

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

4
guest

Vous n'avez pas à utiliser find pour cela. Utilisez simplement globstar dans Shell it-self, comme ceci:

echo **/*foo*

ou:

ls **/*foo*

**/ représente un dossier de façon récursive et *foo* tout fichier dont le nom est foo.

Par défaut, utiliser ls imprimera les noms de fichiers à l’exclusion des fichiers et des répertoires cachés.

Si vous n’avez pas activé la fonctionnalité de recherche, faites-le avec shopt -s globstar.

Remarque: ne nouvelle option de globbing fonctionne dans les shell Bash 4, zsh et 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
2
kenorb

@ Flimm réponse est bon, , en particulier parce qu'il empêche la recherche de descendre dans des répertoires cachés . Je préfère cette simplification:

Généralement pour exclure tous les chemins cachés (fichiers normaux, répertoires, etc.):

find <start-point> -path '*/.*' -Prune -o <expression> -print

Par exemple, en utilisant votre répertoire de travail comme point de départ et -name '*some text*' comme expression:

find . -path '*/.*' -Prune -o -name '*some text*' -print

Contrairement à ce que suggère la réponse de @ Flimm, aucun fichier ni répertoire caché n’est un cas simple. L'expression -path '*/.*' est vraie pour tout chemin d'accès (fichiers normaux, répertoires, etc.) ayant un . immédiatement après votre séparateur de fichiers, /. Donc, cette ligne va élaguer les fichiers cachés et les répertoires.

Autoriser les fichiers cachés tout en excluant les répertoires cachés est le cas qui nécessite un filtre supplémentaire. C'est ici que vous voudriez inclure -type d dans l'expression à élaguer.

find <start-point> -type d -path '*/.*' -Prune -o <expression> -print 

Par exemple:

find . -type d -path '*/.*' -Prune -o -name '*some text*' -print

Dans ce cas, -type d -path '*/.*' est true uniquement pour les répertoires, de sorte que seuls les répertoires sont élagués.

1
De Novo

find a des commutateurs logiques soignés tels que -and et -not vous pouvez les utiliser à votre avantage pour trouver un fichier correspondant avec deux règles comme ceci:

$ 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 constater, find utilise deux règles -name '*hidden_file*' et -and \( -not -name ".*" \) pour rechercher les noms de fichiers correspondant aux deux conditions - nom_fichier avec hidden_file mais sans point de départ. Notez les barres obliques devant les parenthèses - elles sont utilisées pour définir les parenthèses sous la forme d'arguments find plutôt que pour définir un sous-shell (ce qui veut dire entre parenthèses sinon sans barres obliques).

0
$ pwd
/home/victoria

$ find $(pwd) -maxdepth 1 -type f -not -path '*/\.*' | sort
/home/victoria/new
/home/victoria/new1
/home/victoria/new2
/home/victoria/new3
/home/victoria/new3.md
/home/victoria/new.md
/home/victoria/package.json
/home/victoria/Untitled Document 1
/home/victoria/Untitled Document 2

$ find . -maxdepth 1 -type f -not -path '*/\.*' | sed 's/^\.\///g' | sort
new
new1
new2
new3
new3.md
new.md
package.json
Untitled Document 1
Untitled Document 2

Notes:

  • .: dossier actuel
  • supprimer -maxdepth 1 pour effectuer une recherche récursive
  • -type f: recherche des fichiers, pas des répertoires (d)
  • -not -path '*/\.*': ne retourne pas .hidden_files
  • sed 's/^\.\///g': supprime le ./ ajouté à la liste des résultats
0
Victoria Stuart