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:
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:
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
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.
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)
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"
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 à:
01*** 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.
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
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.
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.
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 .
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 . foo*
, lefoo*
serait étendu ET ALORS passé à trouver." "
convient de souligner que cela est très nécessaire pour la recherche récursive.find . -name "foo*" 2>/dev/null
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:
la source
find
a également les-iname
,-regex
et des-iregex
drapeaux pour caractère générique insensible à la casse, regex, et la correspondance regex insensible à la casse, de sorte que la tuyauterie àgrep
n'est pas nécessaire.find
commande qui prend en charge ces options. Devient parfoisgrep
la seule option.find
trouvera tous les fichiers qui correspondent à un modèle:Cependant, si vous voulez une photo:
J'espère que cela t'aides!
la source
brew install tree
pour les utilisateurs de Mac OSX sansapt-get
installationDans 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
la source
Si votre shell prend en charge une nouvelle option de globbing (peut être activée par
shopt -s globstar
, vous pouvez utiliser: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:
Remarque: la ligne ci-dessus peut être collée directement dans le shell ou ajoutée dans le
~/.bashrc
fichier de votre utilisateur .Ensuite, je peux rechercher n'importe quel fichier en tapant:
Alternativement, vous pouvez utiliser un
fd
utilitaire avec une syntaxe simple, par exemplefd pattern
.la source
shopt -s globstar
commande globbing étendue par . Ceci est pris en charge dans Bash, zsh et similaires.bash-3.2$ shopt -s globstar
donnebash: shopt: globstar: invalid shell option name
fd
Dans le cas,
find
est trop lent, essayez l'fd
utilitaire - une alternative simple et rapide à l'find
écriture en rouille.Syntaxe:
Démo:
Page d'accueil: https://github.com/sharkdp/fd
la source
asciinema
, puis convertie au format GIF, mais je ne suis pas sûr.asciicast2vector
peut probablement être utilisé.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)
la source
Vous pouvez utiliser:
Si vous voulez utiliser REGX utiliser
-iname
la source
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"
la source
La manière par défaut de rechercher un fichier récursif et disponible dans la plupart des cas est
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
ou si les pages de manuel ne sont pas disponibles sur votre système
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
Et, pour l'utiliser pour rechercher un type de fichier particulier
Ou, pour rechercher un nom de fichier ou un motif dans le répertoire actuel, vous pouvez taper:
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 --help
ouman 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 à:
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.
la source
pour la recherche de fichiers
find / -xdev -name settings.xml
-> ordinateur entierfind ./ -xdev -name settings.xml
-> répertoire courant et son sous-répertoirepour les fichiers avec le type d'extension
la source
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.
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.
la source
locate "$PWD*.mp4"
Juste pour rappeler que vous pourriez être en mesure de sauter lagrep
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
la source
find / -iname '*C*.xml' 2>/dev/null
Si vous souhaitez rechercher un fichier spécial avec un caractère générique, vous pouvez utiliser le code suivant:
Supposons que vous souhaitiez rechercher tous les fichiers .conf à partir d'ici:
.
signifie que la recherche a commencé à partir d'ici (emplacement actuel)-type
signifie le type d'élément de recherche qui est ici le fichier (f).-name
signifie que vous souhaitez rechercher des fichiers avec des noms * .conf .la source
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:
la source
Utilisation
Explication
find
récursivité.-o
repré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
.la source