Dominique Meeùs
Dernière modification le   
retour à la table des matières — à l’index — à ma page de départ

Rechercher des fichiers, et des fragments de texte dans des fichiers

La commande ls donne les noms de fichiers d’un ou plusieurs répertoires. Des options permettent de choisir divers niveaux de détail, mais souvent trop (comme propriétaire, lecture-écriture…) ou trop peu. On peut mieux contrôler la sortie de la commande find (ci-après) avec son option -printf. Ainsi

find -maxdepth 2 -printf '%f %s \042%Tc\042\n' |sort -o liste

écrit dans un fichier la liste, triée, de tous les fichiers de l’arborescence jusqu’à une certaine profondeur (-maxdepth) en donnant le nom, la dimension, la date et l’heure. La date et l’heure sont entre " " (octal 042) pour passer dans un seul champ d’une table (parce que je voulais recopier ma liste dans LibreOffice Calc).

La commande find a plein d’options pour rechercher des fichiers. Un exemple simple est

find /chemin -name fich*

qui cherche les fichiers de nom correspondant dans le répertoire indiqué et dans ses sous-répertoires. On pourrait chercher aussi les fichiers des dernier jours, ou les fichiers plus récents qu’un fichier donné. Comme on peut aussi prendre la négation d’une condition, cela donne le moyen de chercher des fichiers plus anciens que le fichier donné :

find . ! -newer thisfile

où ici le chemin de départ de la recherche est le .

La commande locate fich* cherche dans une base de données (pas un chemin). Cette base de données doit être à jour (commande updatedb). Certaines distributions remplacent locate par slocate.

La commande grep cherche dans un fichier les lignes contenant un certain motif (pattern) donné par une expression régulière. Par exemple, avec

grep "/Aug/2007:" temp-000000.log > 200708access.log

je sélectionne dans un très long journal de mon site les lignes concernant août 2007 et j’en tire le journal d’août. Attention si on cherche un texte qui serait trompeur en tant qu’expression régulière ; par grep -F "some string", on peut indiquer à grep qu’il ne s’agit que de texte ordinaire, même s’il contient des signes cabalistiques. On peut chercher dans tous les fichiers d’un répertoire et de ses sous-répertoires avec grep -r "pattern" path. Il faut absolument un chemin explicite, donc au moins grep -r "pattern" . où le point indique le répertoire courant. On peut limiter à un type de fichier par--include (en n’oubliant pas le point du répertoire courant, ou un autre dossier) :

grep -rF "some string" . --include="*.xml"

La commande grep accepte un joker dans le nom de fichier et l’omission du répertoire si on cherche seulement dans le répertoire courant. On peut donc écrire grep "string" *.xml, tandis qu’avec presque la même chose grep -r "string" *.xml pour le même répertoire courant (mais avec les sous-répertoires en plus), on est surpris de voir que ça ne marche pas. Il faut comme ci-dessus expliciter le répertoire, même le répertoire courant, et utiliser alors --include pour spécifier s’il y a lieu les fichiers.

Si la chaîne contient des signes double quote, il faut les échapper 20 par une barre inversée. Mais on peut aussi utiliser le signe simple quote pour délimiter toute la chaine et imposer une interprétation littérale de son contenu. Par exemple, pour chercher une valeur d’attribut, on pourrait faire :

grep -rF 'table rend="citquote"' . --include="*.xml"

Par défaut, grep retourne les lignes qui contiennent l’expression recherchée (en mentionnant le fichier). Mais avec grep -l, on a seulement la liste des fichiers qui contiennent l’expression recherchée. Avec grep -L, on a le contraire : la liste des fichiers qui ne contiennent pas l’expression recherchée.

Loook, programme La commande grep ne cherche que dans les fichiers texte. La commande pdfgrep fait la même chose dans les PDF (qui contiennent du texte en plus de l’image) et le programme (GUI) Loook peut le faire dans les fichiers en Open Document Format (ODF, comme .odt .ods…) de LibreOffice et autres. C’est évidemment très précieux. On n’écrit pas seulement en HTML et si on se dit : « dans quel fichier parle-t-on de cela ? dans quel fichier ai-je écrit cela ?… », les pdfgrep et Loook sont indispensables. On trouve Loook en paquet Debian.

Notes
Dominique Meeùs . Date: 2011… 2016