Comment find un file dans le système de files à partir de la command line?

Je suis assez nouveau pour Linux, et je me suis retrouvé dans une situation où j'aimerais find où un file (avec un nom de file partiellement connu) est dans le système de files. Je voudrais savoir comment faire cela à partir de la command line, plutôt que d'utiliser un utilitaire graphique.

Dans Windows, j'exécuterais ce qui suit:

cd /d C:\ dir *filename* /s 

Quel est l'équivalent Linux?

 locate filename find -name '*filename*' echo **/*filename* ls -ld **/*filename* 

(Lisez la suite pour connaître les principaux termes et conditions Lisez le manuel pour les petits caractères.)

L'énumération du contenu d'un directory est une sorte de fonctionnalité secondaire de ls . Le travail principal de ls , celui qui prend le plus de sa complexité, affine son affichage. (Regardez le manuel et comparez le nombre d'options liées au choix des files à afficher par rapport au nombre d'options qui contrôlent les informations à afficher sur chaque file et la façon dont l'affichage est formaté. ll find sur Linux, et d' autres systèmes avec less d'options, depuis les premiers jours.)

Le mode par défaut de ls est que quand vous passez un directory, il répertorie les files dans ce directory. Si vous le transmettez à un autre type de file (file normal, lien symbolique, etc.), il ne répertorie que ce file. (Cela s'applique à chaque argument séparément.) L'option -d indique à ls ne jamais descendre dans un directory.

ls a une option -R qui lui dit de listr les directorys récursivement. Mais il est d'applicabilité limitée, et ne permet pas beaucoup de filtrage sur la sortie.

Le tout premier outil pour effectuer la correspondance de motifs est la coquille elle-même. Vous n'avez pas besoin d'autre command: il suffit de taper vos caractères generics et vous êtes défini. Ceci est connu comme globbing .

 echo *filename* 

Traditionnellement, les caractères generics étaient limités au directory courant (ou au directory indiqué: echo /some/where/*filename* ). A * correspond à n'importe quel nom de file ou toute partie du nom de file, mais *.txt ne correspond pas à foo/bar.txt . Les coquilles modernes ont ajouté le motif **/ qui signifie "dans ce directory, ou dans n'importe quel directory en dessous (récursivement)". Avec bash, pour des raisons de compatibilité historique, cette fonctionnalité doit être explicitement activée avec shopt -s globstar (vous pouvez mettre cette ligne dans votre ~/.bashrc ).

 echo **/*filename* 

La command echo fait simplement écho à la list des noms de files générés par le shell. Par exception, s'il n'y a pas de nom de file correspondant, le model générique rest inchangé dans bash (sauf si vous définissez shopt -s nullglob , auquel cas le model se développe en list vide) et zsh signale une erreur vous définissez setopt nullglob , ou setopt no_no_match qui fait que le model rest inchangé).

Vous pouvez toujours utiliser ls pour ses options. Par exemple, ls peut donner des indications sur la nature ou les permissions du file (directory, exécutable, etc.) à travers les colors. Vous voudrez peut-être afficher la date, la taille et la propriété du file avec ls -l . Consultez le manuel pour plus d'options.

La search traditionnelle pour searchr un file dans une arborescence est find . Il est livré avec de nombreuses options pour contrôler les files à afficher et ce qu'il faut faire avec eux. Par exemple, pour searchr des files dont le nom correspond au model *filename* dans le directory courant et ses sous-directorys et imprimez leurs noms:

 find /some/dir -name '*filename*' -print 

-print est une action (la plupart des autres actions consistent à exécuter une command sur le file); si vous ne mettez pas d'action, l' -print est implicite. En outre, si vous ne spécifiez aucun directory à parcourir ( /some/dir ci-dessus), le directory actuel est implicite. La condition -name '*filename' dit de listr (ou d'agir sur) seulement les files dont le nom correspond à ce model; il existe de nombreux autres filters, tels que -mtime -1 pour correspondre aux files modifiés dans les dernières 24 heures. Vous pouvez parfois omettre les guillemets sur -name '*filename*' , mais uniquement si le caractère générique ne correspond à aucun file du directory courant (voir ci-dessus). Dans l'set, la forme courte est

 find -name '*filename*' 

Un autre outil utile lorsque vous connaissez (une partie de) le nom d'un file est locate . Cet outil interroge une database de noms de files. Sur les systèmes typiques, il est rafraîchi tous les soirs. L'avantage de locate sur find / est que c'est beaucoup plus rapide. Un inconvénient est que ses informations peuvent être périmées. Il existe plusieurs implémentations de locate qui diffèrent dans leur comportement sur les systèmes multi-users: le programme de base locate indexe uniquement les files lisibles publiquement (vous pouvez exécuter le compagnon updatedb pour créer une seconde database qui indexe tous les files de votre count) ; il existe d'autres versions (mlocate, slocate) qui indexent tous les files et ont le programme de locate filterr la database pour ne renvoyer que les files que vous pouvez voir.

 locate filename 

Parfois, vous pensez qu'un file est fourni par un package dans votre dissortingbution, vous connaissez (une partie) le nom du file mais pas le nom de votre package et vous souhaitez installer le package. De nombreuses dissortingbutions fournissent un outil pour cela. Sur Ubuntu, c'est apt-file search filename . Pour des commands équivalentes sur d'autres systèmes, vérifiez le Pacman Rosetta .

l'équivalent de votre exemple DOS serait:

 cd / find . -name \*filename\* -print 

Sur Linux, vous n'avez généralement plus besoin de l'argument -print . Si vous vous trouvez sur d'autres systèmes d'exploitation, il peut être utile de savoir.

Si vous voulez quelque chose de «rapide» , mais pas dans une situation critique et que vous voulez seulement savoir si elle existe et où elle se trouve, vous pouvez utiliser locate . Il garde une database de tous les files dans les directorys que vous lui avez demandé de recueillir des informations.

Dans l'installation par défaut (sur Ubuntu), locate configure un travail cron quotidien qui parsing le système de files et met à jour la database …

Si vous estimez que vous devez mettre la database à jour avant la prochaine mise à jour cron, il est généralement plus rapide que find ou ls pour simplement exécuter sudo updatedb , puis locate . Il est certainement plus rapide si vous avez besoin de faire plus de searchs … comme son nom l'indique, updatedb met à jour la database qui …

locate a regex embedded, ce qui le rend très pratique … Je vais utiliser find dans un script, mais j'utilise rarement find à la command line. J'utilise même locate dans des scripts (personnels) … par exemple. locate -bir "oo.*datt.*mp4$"

locate renvoie les paths complets des files correspondants.

 find [path] -name [filename] 

Par exemple, si je veux searchr dans le directory / home un nom de file contenant foo, j'utiliserais la command:

 find /home -name *foo* 

utilisez la command man find pour plus d'informations sur la command find et les arguments,