J'ai hérité d'une vaste archive multimédia sans schéma organisationnel unifié. Son contenu date d'au moins dix ans. On m'a demandé de trouver une aiguille dans cette botte de foin, et j'ai quelques idées quant au nom de cette aiguille. Mais je ne suis pas certain de son nom. Je veux utiliser un seul find
dans le terminal pour rechercher des noms alternatifs. Et je veux inclure un deuxième ensemble : les extensions de fichiers possibles. En pseudocode, voici ce que je veux dire : find [in a given directory] [files and folders whose name matches (*guess1* OR *guess2*) AND whose name matches (*.extension1 OR *.extension2)]
. Comment dois-je exprimer cela dans le terminal ?
Réponses
Trop de publicités?Utilisez la commande
find /dir/to/search \( -iname '*guess1*' -o -iname '*guess2*' \) \
\( -iname '*.extension1' -o -iname '*.extension2' \)
find
fonctionne de manière récursive. Utilisez -maxdepth 1
pour le rendre non-récursif.
-iname
fait une correspondance insensible à la casse du nom de fichier.
Les arguments sont implicitement joints par AND, mais vous pouvez utiliser la commande -o
pour le rendre OR. Les parenthèses doivent être échappées par une barre oblique inverse pour les protéger du shell.
(On pourrait l'écrire sur une seule ligne ; ici, j'ai brisé les lignes en utilisant la fonction \return pour plus de lisibilité).
find
est lent. grep
et d'autres outils de recherche de texte sont beaucoup plus rapides. À moins que vous ne pensiez trouver l'aiguille dans la botte de foin du premier coup, il est probablement préférable de faire un find
dans un fichier temporaire, par exemple find . -print > /tmp/find.out
puis recherchez dans ce fichier les noms de fichiers qui répondent à vos critères de recherche.
Si le volume est indexé par Spotlight, alors utilisez mdfind
pour des résultats plus rapides.
mdfind -onlyin /dir/to/search '(kMDItemFSName==*guess1* || kMDItemFSName==*guess2*)' \
'&& (kMDItemFSName=*.extension1 || kMDItemFSName=*.extension2)'