Comment supprimer des fichiers dans un répertoire à l’exception de quelques extensions
Parfois, vous pouvez vous retrouver dans une situation où vous devez supprimer tous les fichiers d’un répertoire ou simplement nettoyer un répertoire en supprimant tous les fichiers sauf ceux avec une extension spécifique (par exemple, les fichiers se terminant par un type particulier).
Dans cet article, nous allons vous montrer comment supprimer des fichiers dans un répertoire, à l’exclusion de certaines extensions ou types de fichiers, à l’aide des commandes rm, find et globignore.
Avant d’aller plus loin, commençons par jeter un bref coup d’œil à un concept important sous Linux : la correspondance des modèles de noms de fichiers, qui nous permettra de résoudre notre problème.
Sous Linux, un modèle shell est une chaîne composée des caractères spéciaux suivants, appelés caractères génériques ou métacaractères :
*– correspond à zéro ou plusieurs caractères?– correspond à n’importe quel caractère unique[seq]– correspond à n’importe quel caractère dansseq[ !seq]– correspond à n’importe quel caractère qui n’est pas dansseq
Il y a trois méthodes possibles que nous allons explorer ici, et celles-ci incluent :
Suppression de fichiers à l’aide d’opérateurs de correspondance de motifs étendus
Les opérateurs de correspondance de motif étendue sont répertoriés ci-dessous. Dans ce cas, pattern-list fait référence à un ou plusieurs noms de fichiers, séparés par le caractère | :
*(pattern-list)– correspond à zéro ou plusieurs occurrences des motifs spécifiés? (liste de motifs)– correspond à zéro ou à une occurrence des motifs spécifiés- +(liste de motifs) – correspond à une ou plusieurs occurrences des motifs spécifiés
@(pattern-list)– correspond à l’un des motifs spécifiés! (liste de motifs)– correspond à tout sauf à l’un des motifs donnés
Pour les utiliser, activez l’option de shell extglob comme suit :
shopt -s extglob
1. Pour supprimer tous les fichiers d’un répertoire à l’exception d’un fichier spécifique, tapez la commande suivante :
rm -v !("filename")
2. Pour supprimer tous les fichiers à l’exception de nom_fichier1 et nom_fichier2 :
rm -v !("filename1"|"filename2")
3. Pour supprimer tous les fichiers à l’exception des fichiers .zip, de manière interactive :
rm -i !(*.zip)
4. Pour supprimer tous les fichiers à l’exception des fichiers .zip et .odt tout en affichant les actions en cours :
rm -v !(*.zip|*.odt)
Une fois que vous avez toutes les commandes requises, désactivez l’option de shell extglob comme suit :
shopt -u extglob
Supprimer des fichiers à l’aide de la commande find de Linux
Dans le cadre de cette méthode, nous pouvons utiliser la commande find exclusivement avec les options appropriées ou en conjonction avec la commande xargs en utilisant un pipeline comme dans les formulaires ci-dessous :
find /directory/ -type f -not -name 'PATTERN' -delete
find /directory/ -type f -not -name 'PATTERN' -print0 | xargs -0 -I {} rm {}
find /directory/ -type f -not -name 'PATTERN' -print0 | xargs -0 -I {} rm [options] {}
5. La commande suivante supprimera tous les fichiers à l’exception de .gz fichiers dans le répertoire courant :
find . -type f -not -name '*.gz'-delete
6. À l’aide d’un pipeline et de xargs, vous pouvez modifier la casse ci-dessus comme suit :
find . -type f -not -name '*gz' -print0 | xargs -0 -I {} rm -v {}
7. Prenons un exemple supplémentaire, la commande ci-dessous effacera tous les fichiers à l’exception des fichiers .gz, .odt et .jpg dans le répertoire actuel :
find . -type f -not \(-name '*gz' -or -name '*odt' -or -name '*.jpg' \) -delete
Supprimer des fichiers à l’aide de la variable bash GLOBIGNORE
Cette dernière approche, cependant, ne fonctionne qu’avec bash. Ici, la variable GLOBIGNORE stocke une liste de motifs séparés par des deux-points (noms de fichiers) à ignorer par l’expansion du nom de chemin.
Pour utiliser cette méthode, allez dans le répertoire que vous souhaitez nettoyer, puis définissez la variable GLOBIGNORE comme suit :
cd test
GLOBIGNORE=*.odt:*.iso:*.txt
Dans ce cas, tous les fichiers autres que .odt, .iso et .txt fichiers avec doivent être supprimés du répertoire actuel.
Exécutez maintenant la commande pour nettoyer le répertoire :
rm -v *
Ensuite, désactivez la variable GLOBIGNORE :
$ unset GLOBIGNORE
Remarque : Pour comprendre la signification des drapeaux utilisés dans les commandes ci-dessus, reportez-vous aux pages de manuel de chaque commande que nous avons utilisée dans les différentes illustrations.
Conclusion
Voici quelques moyens simples et efficaces de supprimer des fichiers sous Linux, en ne gardant intacts que ceux avec des extensions ou des noms de fichiers spécifiques. Si vous connaissez d’autres techniques utiles en ligne de commande pour nettoyer les répertoires, n’hésitez pas à les partager dans la section des commentaires ci-dessous.







