Comment puis-je trouver récursivement tous les fichiers dans le dossier actuel et les sous-dossiers en fonction de la correspondance générique?

1889

Comment puis-je trouver récursivement tous les fichiers dans le dossier actuel et les sous-dossiers en fonction de la correspondance générique?

John
la source

Réponses:

2742

Utilisez find pour cela:

find . -name "foo*"

finda besoin d'un point de départ et le .(point) pointe vers le répertoire courant.

tux21b
la source
21
Je sais que c'est étiqueté comme linux mais cela vaut la peine d'être mentionné: le chemin est requis pour sur les autres variantes * nix qui ne sont pas linux. Sous linux, le chemin est facultatif si vous souhaitez utiliser dot.
IslandCow
4
@Seatter "foo *" indique à find de rechercher tous les fichiers commençant par "foo". Ce n'est que son exemple. Vous pouvez utiliser "gpio *" pour rechercher tous les fichiers dont le nom commence par gpio, ou simplement "gpio1" pour rechercher tous les fichiers nommés gpio1.
schumacher574
29
notez que le "foo *" est entre guillemets donc le shell ne le développe pas avant de le passer à trouver. si vous venez de le faire find . foo*, le foo*serait étendu ET ALORS passé à trouver.
grinch
33
Il " "convient de souligner que cela est très nécessaire pour la recherche récursive.
WesternGun
3
Aussi utile: si vous ne voulez pas être informé des répertoires find . -name "foo*" 2>/dev/null
auxquels
222

Tuyauter trouver dans grep est souvent plus pratique; il vous donne toute la puissance des expressions régulières pour la correspondance arbitraire de caractères génériques.

Par exemple, pour rechercher tous les fichiers avec la chaîne insensible à la casse "foo" dans le nom de fichier:

~$ find . -print | grep -i foo
Paul Whipp
la source
58
finda également les -iname, -regexet des -iregexdrapeaux pour caractère générique insensible à la casse, regex, et la correspondance regex insensible à la casse, de sorte que la tuyauterie à grepn'est pas nécessaire.
iobender
7
Je ne pense pas qu'il s'agit d'être inutile, mais d'être plus pratique.
Elijah Lynn
1
Cependant, le piping vers grep -v peut vous permettre d'utiliser des chaînes simples ou des expressions régulières pour supprimer les entrées dont vous ne voulez pas.
door_number_three
3
@iobender - Malheureusement, je peux vous dire par expérience que tous les systèmes ne sont pas livrés avec une findcommande qui prend en charge ces options. Devient parfois grepla seule option.
M. Llama
150

find trouvera tous les fichiers qui correspondent à un modèle:

find . -name "*foo"

Cependant, si vous voulez une photo:

tree -P "*foo"

J'espère que cela t'aides!

IslandCow
la source
18
brew install treepour les utilisateurs de Mac OSX sans apt-getinstallation
DeBraid
1
Testé sur macOS Sierra, ajoutez simplement '--print' -> 'find. nom "* foo" --print '. superuser.com/questions/177289/searching-mac-through-terminal
john-salib
2
sudo yum install tree -y pour CentOS
Santosh Kumar Arjunan
39
find -L . -name "foo*"

Dans quelques cas, j'ai eu besoin du paramètre -L pour gérer les liens de répertoires symboliques. Par défaut, les liens symboliques sont ignorés. Dans ces cas, c'était assez déroutant car je changerais de répertoire en sous-répertoire et verrais le fichier correspondant au modèle mais find ne retournerait pas le nom de fichier. L'utilisation de -L résout ce problème. Les options de lien symbolique pour la recherche sont -P -L -H

toddcscar
la source
1
Le commutateur L est très utile. Souvent, l'utilisateur n'a aucune idée des répertoires sous-jacents, qu'il s'agisse de liens logiciels ou de répertoires normaux. Donc en cas de doute, il est toujours bon d'utiliser l'option L. Au moins, cela m'a toujours aidé.
Ritesh
2
C'était la réponse pour moi. Merci!
iedmrc
34

Si votre shell prend en charge une nouvelle option de globbing (peut être activée parshopt -s globstar , vous pouvez utiliser:

echo **/*foo*

pour rechercher tous les fichiers ou dossiers de manière récursive. Ceci est supporté par Bash 4, zsh et des shells similaires.


Personnellement, j'ai défini cette fonction shell:

f() { find . -name "*$1*"; }

Remarque: la ligne ci-dessus peut être collée directement dans le shell ou ajoutée dans le ~/.bashrcfichier de votre utilisateur .

Ensuite, je peux rechercher n'importe quel fichier en tapant:

f some_name

Alternativement, vous pouvez utiliser un fdutilitaire avec une syntaxe simple, par exemple fd pattern.

kenorb
la source
1
Cela va juste dans un seul niveau. Ne pas revenir dans les sous-répertoires pour moi
Broncha
3
@Broncha Parce que vous devez activer la shopt -s globstarcommande globbing étendue par . Ceci est pris en charge dans Bash, zsh et similaires.
kenorb
bash-3.2$ shopt -s globstardonnebash: shopt: globstar: invalid shell option name
drewish
@drewish Vous devez mettre à niveau votre Bash vers 4.x
kenorb
echo * / * foo est moins rapide que find
Josef Klimuk
32

fd

Dans le cas, findest trop lent, essayez l' fdutilitaire - une alternative simple et rapide à l' findécriture en rouille.

Syntaxe:

fd PATTERN

Démo:

Page d'accueil: https://github.com/sharkdp/fd

kenorb
la source
17
Première fois que j'ai vu un gif sur SO depuis près de 9 ans. Bon travail!
Joshua Pinter
1
Ces résultats de performance semblent très prometteurs. Vous pourriez envisager d'ajouter du fd au brassage à domicile ...
Gr3go
hors sujet: quel outil avez-vous utilisé pour créer un fichier svg pour démo?
Aprodan
2
@aprodan L'image de démonstration a été copiée à partir de GitHub, mais je crois qu'ils utilisent asciinema, puis convertie au format GIF, mais je ne suis pas sûr.
kenorb
1
En fait, c'est le format SVG, donc asciicast2vectorpeut probablement être utilisé.
kenorb
27
find <directory_path>  -type f -name "<wildcard-match>"

Dans le caractère générique, vous pouvez fournir la chaîne que vous souhaitez faire correspondre, par exemple * .c (pour tous les fichiers c)

XYZ_Linux
la source
1
Votre réponse est la première la plus correcte ici car elle recherche uniquement les fichiers comme spécifié. Les autres ne spécifiant pas de type renverront des répertoires.
wilsotc
si vous souhaitez rechercher un répertoire "-type f" pourrait être changé en "-type d"
XYZ_Linux
11

Vous pouvez utiliser:

# find . -type f  -name 'text_for_search'

Si vous voulez utiliser REGX utiliser -iname

# find . -type f  -iname 'text_for_search'
user8848899
la source
9

La commande suivante répertorie tous les fichiers portant le nom exact "modèle" (par exemple) dans le dossier actuel et ses sous-dossiers.

find ./ -name "pattern"

anshul
la source
8

La manière par défaut de rechercher un fichier récursif et disponible dans la plupart des cas est

find . -name "filepattern"

Il commence la traversée récursive pour le nom de fichier ou le modèle depuis le répertoire courant où vous êtes positionné. Avec la commande find, vous pouvez utiliser des caractères génériques et divers commutateurs pour afficher la liste complète des options, tapez

man find

ou si les pages de manuel ne sont pas disponibles sur votre système

find --help

Cependant, il existe des outils plus modernes et plus rapides à trouver, qui parcourent l'ensemble de votre système de fichiers et indexent vos fichiers, un de ces outils courants est de localiser ou de slacer / mlocate, vous devriez vérifier le manuel de votre système d'exploitation sur la façon de l'installer, et une fois qu'il est installé, il doit lancer la base de données, si le script d'installation ne le fait pas pour vous, il peut être fait manuellement en tapant

sudo updatedb

Et, pour l'utiliser pour rechercher un type de fichier particulier

locate filename

Ou, pour rechercher un nom de fichier ou un motif dans le répertoire actuel, vous pouvez taper:

 pwd | xargs -n 1 -I {} locate "filepattern"

Il parcourra sa base de données de fichiers et imprimera rapidement les noms de chemin correspondant au modèle que vous avez tapé. Pour voir la liste complète des options de localisation, tapez: locate --helpouman locate

De plus, vous pouvez configurer Locate pour mettre à jour sa base de données à des heures planifiées via un travail cron, donc un exemple de cron qui met à jour db à 1h du matin ressemblerait à:

0 1 * * * updatedb

Ces tâches cron doivent être configurées par root, car updatedb a besoin du privilège root pour parcourir tout le système de fichiers.

Aleksandar Pavić
la source
7

pour la recherche de fichiers
find / -xdev -name settings.xml -> ordinateur entier
find ./ -xdev -name settings.xml -> répertoire courant et son sous-répertoire

pour les fichiers avec le type d'extension

find . -type f -name "*.iso"
Alberto
la source
6

Je suis surpris de voir que la localisation n'est pas très utilisée lorsque nous devons y aller récursivement.

Je voudrais d'abord localiser "$ PWD" pour obtenir la liste des fichiers dans le dossier courant d'intérêt, puis exécuter des greps à leur guise.

locate "$PWD" | grep -P <pattern>

Bien sûr, cela suppose que la mise à jour est effectuée et que l'index est mis à jour périodiquement. C'est un moyen beaucoup plus rapide de rechercher des fichiers que d'exécuter une recherche et de lui demander de descendre dans l'arborescence. Mentionnant cela pour être complet. Rien contre l'utilisation de find, si l'arbre n'est pas très lourd.

melchi
la source
locate "$PWD*.mp4" Juste pour rappeler que vous pourriez être en mesure de sauter lagrep
Jefferey Cave
5

La commande ci-dessous permet de rechercher tous les fichiers

1) Quel que soit le cas
2) Résultat Exclure les dossiers sans autorisation
3) Rechercher à partir de la racine ou du chemin que vous aimez. Changez / avec le chemin que vous préférez.

Syntaxe:
find -iname '' 2> & 1 | grep -v "Autorisation refusée"

Exemple

find / -iname 'C * .xml' 2> & 1 | grep -v "Autorisation refusée"

find / -iname '*C*.xml'   2>&1 | grep -v "Permission denied"
MukeshKoshyM
la source
1
pourquoi diable utilisez-vous grep pour cela? Il suffit de rediriger stderr vers nullfind / -iname '*C*.xml' 2>/dev/null
phuclv
3

Si vous souhaitez rechercher un fichier spécial avec un caractère générique, vous pouvez utiliser le code suivant:

find . -type f -name "*.conf"

Supposons que vous souhaitiez rechercher tous les fichiers .conf à partir d'ici:

.signifie que la recherche a commencé à partir d'ici (emplacement actuel)
-typesignifie le type d'élément de recherche qui est ici le fichier (f).
-namesignifie que vous souhaitez rechercher des fichiers avec des noms * .conf .

Reza Harasani
la source
3

Cela recherchera tous les fichiers associés dans les répertoires actuels et secondaires, calculant leur nombre de lignes séparément ainsi que totalement:

find . -name "*.wanted" | xargs wc -l
Jay Yang
la source
2

Utilisation

find path/to/dir -name "*.ext1" -o -name "*.ext2"

Explication

  1. Le premier paramètre est le répertoire que vous souhaitez rechercher.
  2. Par défaut, la findrécursivité.
  3. Le -oreprésente -or. Donc, ci-dessus signifie rechercher ce caractère générique OU celui-ci. Si vous n'avez qu'un seul motif, alors pas besoin de -o.
  4. Les guillemets autour du motif générique sont obligatoires.
Shital Shah
la source