3 façons de supprimer tous les fichiers d’un répertoire à l’exception d’un ou de quelques fichiers avec des extensions
Parfois, vous vous retrouvez 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 les fichiers d’un type donné (se terminant par une extension particulière).
Dans cet article, nous allons vous montrer comment supprimer des fichiers dans un répertoire à l’exception 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.
Lecture suggérée : Utilisez la commande find pour rechercher plusieurs noms de fichiers/extensions sous Linux
Sous Linux, un modèle d’interpréteur de commandes 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 dans seq[ !seq]– correspond à n’importe quel caractère qui n’est pas dans seq
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 différents opérateurs de filtrage étendu sont répertoriés ci-dessous, où pattern-list est une liste contenant 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 du nom de fichier, tapez la commande ci-dessous :
$ rm -v !("filename")
2. Pour supprimer tous les fichiers à l’exception de nom_fichier1 et nom_fichier2 :
$ rm -v !("filename1"|"filename2")
3. L’exemple ci-dessous montre comment supprimer tous les fichiers autres que tous les fichiers .zip de manière interactive :
$ rm -i !(*.zip)
4. Ensuite, vous pouvez supprimer tous les fichiers d’un répertoire à l’exception de tous les fichiers .zip et .odt comme suit, tout en affichant ce qui est fait :
$ 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 des fichiers .gz dans le répertoire actuel :
$ 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 ne fonctionne cependant 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.
Suggéré pour lire : 12 exemples pratiques utiles sur la commande grep sous Linux
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.
C’est tout ! Si vous avez d’autres techniques en ligne de commande en tête dans le même but, n’oubliez pas de partager avec nous via notre section de commentaires ci-dessous.







