Cet article vient en complément de mon article Comment appliquer récursivement une instruction à des fichiers sous Linux, pour préciser comment formuler la recherche.
Sous Linux, lorsqu’au sein d’un même répertoire, deux fichiers s’enregistrent sous le même nom, le système rajoute automatiquement entre la fin du nom et l’extension un nombre entre parenthèses qui s’incrémente automatiquement avec le nombre de copies. Par exemple si un de vos logiciels enregistre plusieurs fois le fichier « I_love_linux.txt » dans ce répertoire, la deuxième copie sera enregistrée avec le nom « I_love_linux(1).txt », la troisième avec « I_love_linux(2).txt », et ainsi de suite.
Pour des raisons élémentaires de gain de place, il peut être utile de supprimer ces fichiers, et le but de cet article est de trouver une commande qui fait ça automatiquement. L’astuce est de combiner correctement les caractères universels de la commande find. Pour rappel:
- le caractère ‘*’ remplace n’importe quelle chaine de caractères.
- le caractère ‘?’ remplace n’importe quel caractère.
Donc dans le cas où aucun fichier ne porte de nom avec quelque chose entre parenthèse dedans sinon les fichiers copies, il suffira d’utiliser la commande find avec le pattern « *(*).* ». Dans le cas contraire, il faudra d’abord rechercher les fichiers compris entre 1 et 9, puis ceux entre 10 et 99, et ainsi de suite avec le pattern « *(?).* », puis avec le pattern « *(??).* », et ainsi de suite ; ou encore utiliser un pattern plus complexe qui laisse le choix du nombre de caractères en précisant qu’on ne veut que des numéros, mais je n’entrerai pas dans les détails ici.
Par exemple j’ai pu utiliser la commande find -name « *(??).* » -exec rm {} \; pour supprimer mes fichiers doublons compris entre 10 et 99.