Rechercher un fichier

De Wiki de la communauté Mandriva.


Mais où se trouve ce satané fichier ?!?

Sommaire

Méthode graphique

C'est la méthode la plus simple et que vous avec déjà probablement trouvé. Ce programme de recherche est disponible par exemple dans le menu de KDE. Puisqu'il est assez intuitif, je ne m'attarde pas trop.

Catfish

Catfish est une interface graphique utilisant les différents outils de recherche disponibles sous GNU/Linux tels que find, locate, beagle où encore slocate.

Méthode textuelle

Les autres méthodes seront des méthodes qui utilisent la console. Ne fuyez pas !

find

Recherche d'un fichier

find va effectuer une recherche directement dans un dossier. La syntaxe est la suivante :

find ''chemin_du_repertoire'' -name ''nom_du_fichier''

ex :

Image:Konsole.png
[utilisateur@ordi ~]$ find /home/moi/ -name ma_photo.jpg

cherchera le fichier ma_photo.jpg dans mon dossier personnel. On peut remplacer /home/moi/ par un . Si on veut cherche dans autre dossier, on mets cet autre chemin, bien sûr.

Si on veut chercher sur toute l'arborescence :

Image:Konsole.png
[utilisateur@ordi ~]$ find / -name ma_photo.jpg

Ceci est long, et inutile si vous rangez bien vos fichiers. De plus, cette commande lancée en tant qu'utilisateur ne pourra pas voir tous les fichiers.

Recherche d'un répertoire

Image:Konsole.png
[utilisateur@ordi ~]$ find /home/ -type d -name trav

cherchera non plus un fichier, mais un dossier commençant par trav

Autres options

find comporte de nombreuses options. Je vous conseille la lecture du man :

Image:Konsole.png
[utilisateur@ordi ~]$ man find

voir Les manuels de Linux : man et info.

locate : plus véloce

Image:Konsole.png
[utilisateur@ordi ~]$ locate nom_du_fichier

locate effectue une recherche sur tout le disque (en réalité pas tout à fait...) mais en beaucoup plus rapide ! Pourquoi ? plutôt que de travailler quand on lui demande, il travaille seul en cachette pour se faire sa petite liste des choses présentes. Il est malin. Ce travail en cachette est réalisé par updatedb. Ce processus est normalement lancé automatiquement et régulièrement via une tache cron. Il est installé par défaut sur mandriva.

Regardons le fichier de configuration de updatedb (trouvé grâce à un locate :D ) cat /etc/updatedb.conf donne chez moi :

## Mandriva Linux configuration.

#
# Originally written by Chmouel Boudjnah <chmouel@mandrakesoft.com>
#
# Modified 20010109 by Francis Galiegue <fg@mandrakesoft.com>
#
# Fixes by mlord@pobox.com, 20010328


# Which directories to exclude. /home and /root are excluded for privacy, but
# YMMV
PRUNEPATHS="/proc /tmp /var/tmp /usr/tmp /net /afs /mnt /afs /media /sfs /var/spool/cups /var/spool/squid"


# Which filesystems do we exclude from search?
PRUNEFS="nfs smbfs ncpfs proc devpts supermount vfat iso9660 udf usbdevfs devfs auto afs sfs"

On voit que sont exclus des PRUNEPATHS (chemins) et des PRUNEFS (système de fichiers). En effet, rien ne sert l'aller chercher des choses dans un /tmp par exemple.

updatedb est lancé via la tache cron : mlocate.cron

whereis

Littéralement : où est... ?

whereis permet de chercher les exécutables comme firefox, nano, cat, vi etc. (et parfois même un poil plus). On l'utilise très simplement :

Image:Konsole.png
[utilisateur@ordi ~]$ whereis firefox

et on obtient :

 firefox: /usr/bin/firefox

L'exécutable, vous l'aurez reconnu c'est /usr/bin/firefox.

Un inconvénient de whereis est qu'il ne détecte ni les alias, ni les fonctions, ni les commandes internes du shell (shell builtins). Pour cela vous devrez utiliser la commande type, très utile lorsque vous créez un alias ou une fonction et souhaitez savoir si son nom est déjà pris. Voir là-dessus cette section.

which

which localise les commandes : comme nano, cat, vi etc.

Différence avec whereis ? whereis cherche partout, which cherche uniquement dans le $PATH de l'utilisateur qui emploie la commande. ( Plus d'informations sur le $PATH )

Exemple : En tant qu'utilisateur (non root) :

Image:Konsole.png
[utilisateur@ordi ~]$ whereis urpmi
urpmi: /usr/bin/urpmi.update /usr/sbin/urpmi.addmedia /usr/sbin/urpmi.update /usr/sbin/urpmi.removemedia /usr/sbin/urpmi /etc/urpmi 

Il l'a bien trouvé, on est content.

Image:Konsole.png
[utilisateur@ordi ~]$ which urpmi
which: no urpmi in (/usr/bin:/bin:/usr/local/bin:/usr/X11R6/bin/:/usr/games:/usr/lib/qt4/bin:/usr/share/pvm3:/home/gnu/bin:/usr/lib/ssh:/usr/lib/qt4/bin:/usr/share/pvm3)

Il n'a rien trouvé dans mon $PATH. On voit bien qu'il cherche dans le $PATH :

[gnu@localhost Incoming]$ echo $PATH
/usr/bin:/bin:/usr/local/bin:/usr/X11R6/bin/:/usr/games:/usr/lib/qt4/bin:/usr/share/pvm3:/home/gnu/bin:/usr/lib/ssh:/usr/lib/qt4/bin:/usr/share/pvm3

Cela ne servait à rien de cherche sur tout le disque car de toute façon, je cherche une commande que je ne pourrai pas lancer...

Un inconvénient de which est qu'il ne détecte ni les alias, ni les fonctions, ni les commandes internes du shell (shell builtins). Pour cela vous devrez utiliser la commande type, très utile lorsque vous créez un alias ou une fonction et souhaitez savoir si son nom est déjà pris. Voir là-dessus la section suivante.

type

Si vous souhaitez créer un alias, ou une fonction sur votre système, il est essentiel d'être certain que son nom n'est pas déjà pris. Pour cela type est parfait.


Attention !
Evitez d'utiliser which ou whereis à cet usage : les alias, les fonctions et les commandes internes du shell ne seraient pas détectés.


Attention !
type ne détecte que ce qui est accessible à l'utilisateur qui lance type.


Quelques exemples :

  • la commande qui lance la suite bureautique OpenOffice.org :
Image:Konsole.png
[utilisateur@ordi ~]$ type soffice

soffice est /usr/bin/soffice

  • un alias créé par Mandriva dans /etc/profile.d/alias.sh :
Image:Konsole.png
[utilisateur@ordi ~]$ type ll

ll est un alias vers « ls -l »

  • une fonction personnelle créée par l'utilisateur dans /etc/bashrc ou ~/.bash_profile - notez que le contenu de la fonction est affiché :
Image:Konsole.png
[utilisateur@ordi ~]$ type music

music est une fonction

music ()

{ find ~/Musique/ -type f \( -ipath '*'$1'*.ogg' -o -ipath '*'$1'*.mp[3,4]' \) -print0 | xargs -0\ -r -t vlc

}

  • une commande interne du shell :
Image:Konsole.png
[utilisateur@ordi ~]$ type cd

cd est une primitive du shell

  • une commande qui n'existe pas (du moins pour l'utilisateur qui a lancé type) :
Image:Konsole.png
[utilisateur@ordi ~]$ type groin

bash: type: groin : non trouvé