locate filename
find -name '*filename*'
echo **/*filename*
ls -ld **/*filename*
(Lisez la suite pour les principales conditions générales. Lisez le manuel pour les petits caractères.)
Lister le contenu d'un répertoire est une sorte de fonctionnalité secondaire de ls
. Le travail principal de ls
, celui qui occupe la majeure partie de sa complexité, est de peaufiner son affichage. (Regardez le manuel et comparez le nombre d'options liées au choix des fichiers à afficher par rapport au nombre d'options qui contrôlent les informations à afficher sur chaque fichier et la façon dont l'affichage est formaté. Cela est vrai pour les deux GNU que vous '' Je vais trouver sur Linux, et sur d' autres systèmes avec moins d'options, depuis les premiers jours.)
Le mode par défaut ls
est que lorsque vous lui passez un répertoire, il répertorie les fichiers dans ce répertoire. Si vous lui passez un autre type de fichier (fichier normal, lien symbolique, etc.), il répertorie uniquement ce fichier. (Cela s'applique à chaque argument séparément.) L'option -d
indique de ls
ne jamais descendre dans un répertoire.
ls
a une option -R
qui lui indique de lister les répertoires de manière récursive. Mais son applicabilité est limitée et ne permet pas beaucoup de filtrage sur la sortie.
Le tout premier outil pour effectuer la correspondance de motifs est le shell lui-même. Vous n'avez besoin d'aucune autre commande: tapez simplement vos caractères génériques et vous êtes prêt. Ceci est connu sous le nom de globbing .
echo *filename*
Traditionnellement, les caractères génériques étaient limités au répertoire actuel (ou au répertoire indiqué:) echo /some/where/*filename*
. A *
correspond à n'importe quel nom de fichier ou partie de nom de fichier, mais *.txt
ne correspondra pas foo/bar.txt
. Les shells modernes ont ajouté le motif **/
qui signifie «dans ce répertoire, ou dans n'importe quel répertoire 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 echo
commande fait simplement écho à la liste des noms de fichiers générés par le shell. Par exception, s'il n'y a aucun nom de fichier correspondant, le modèle générique reste inchangé dans bash (sauf si vous le définissez shopt -s nullglob
, auquel cas le modèle se développe dans une liste vide), et zsh signale une erreur (sauf si vous le définissez setopt nullglob
, ou setopt no_no_match
ce qui fait que le motif reste inchangé).
Vous pouvez toujours vouloir utiliser ls
ses options. Par exemple, ls
peut donner des indications sur la nature ou les autorisations du fichier (répertoire, exécutable, etc.) à travers les couleurs. Vous souhaiterez peut-être afficher la date, la taille et la propriété du fichier avec ls -l
. Consultez le manuel pour de nombreuses autres options.
La commande traditionnelle pour rechercher un fichier dans une arborescence de répertoires est find
. Il est livré avec de nombreuses options pour contrôler les fichiers à afficher et ce que vous devez en faire. Par exemple, pour rechercher des fichiers dont le nom correspond au modèle *filename*
dans le répertoire en cours et ses sous-répertoires et imprimer leurs noms:
find /some/dir -name '*filename*' -print
-print
est une action (la plupart des autres actions consistent à exécuter une commande sur le fichier); si vous ne mettez pas d'action, -print
est implicite. De plus, si vous ne spécifiez aucun répertoire à parcourir ( /some/dir
ci-dessus), le répertoire actuel est implicite. La condition -name '*filename'
indique de répertorier (ou d'agir) uniquement les fichiers dont le nom correspond à ce modèle; il existe de nombreux autres filtres, par exemple pour -mtime -1
faire correspondre les fichiers modifiés au cours des dernières 24 heures. Vous pouvez parfois omettre les guillemets -name '*filename*'
, mais uniquement si le caractère générique ne correspond à aucun fichier du répertoire actuel (voir ci-dessus). Dans l'ensemble, la forme courte est
find -name '*filename*'
Un autre outil utile lorsque vous connaissez (une partie de) le nom d'un fichier est locate
. Cet outil interroge une base de données de noms de fichiers. Sur les systèmes typiques, il est actualisé tous les soirs. L'avantage de locate
Over find /
est qu'il est beaucoup plus rapide. Un inconvénient est que ses informations peuvent être périmées. Il existe plusieurs implémentations locate
dont le comportement diffère sur les systèmes multi-utilisateurs: le locate
programme de base indexe uniquement les fichiers lisibles par le public (vous souhaiterez peut-être exécuter le compagnon updatedb
pour créer une deuxième base de données qui indexe tous les fichiers de votre compte); il existe d'autres versions (mlocate, slocate) qui indexent tous les fichiers et font locate
filtrer la base de données par le programme pour ne renvoyer que les fichiers que vous pouvez voir.
locate filename
Parfois, vous pensez qu'un fichier est fourni par un package dans votre distribution, vous connaissez (en partie) le nom du fichier mais pas le nom de votre package, et vous souhaitez installer le package. De nombreuses distributions fournissent un outil pour cela. Sur Ubuntu, ça l'est apt-file search filename
. Pour des commandes équivalentes sur d'autres systèmes, consultez le Pacman Rosetta .
ls
?