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 à l'exception des 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 de rm , trouver et globignore commandes.
Avant d'aller plus loin, commençons par jeter un coup d'œil à un concept important de Linux - la correspondance des modèles de noms de fichiers, qui nous permettra de traiter notre problème actuel.
Lecture suggérée : Utilisez la commande find pour rechercher plusieurs noms de fichiers/extensions sous Linux
Sous Linux, un modèle de 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 dans seq[!seq]
– correspond à n'importe quel caractère qui n'est pas dans seq
Il existe trois méthodes possibles que nous allons explorer ici, et celles-ci incluent :
Supprimer des fichiers à l'aide d'opérateurs de correspondance de modèles étendus
Les différents opérateurs de correspondance de modèles étendus 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 modèles spécifiés?(pattern-list)
– correspond à zéro ou une occurrence des modèles spécifiés- +(liste de motifs) – correspond à une ou plusieurs occurrences des modèles spécifiés
@(pattern-list)
– correspond à l'un des modèles spécifiés!(pattern-list)
– correspond à tout sauf à l'un des modèles donnés
Pour les utiliser, activez le extglob option shell comme suit :
# shopt -s extglob
1. Pour supprimer tous les fichiers d'un répertoire à l'exception de filename, tapez la commande ci-dessous :
$ rm -v !("filename")


2. Pour supprimer tous les fichiers à l'exception de filename1 et filename2 :
$ rm -v !("filename1"|"filename2")


3. L'exemple ci-dessous montre comment supprimer tous les fichiers autres que tous les fichiers .zip
fichiers 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
fichiers comme suit, tout en affichant ce qui est en train d'être fait :
$ rm -v !(*.zip|*.odt)


Une fois que vous avez toutes les commandes requises, désactivez extglob option shell comme ceci :
$ shopt -u extglob
Supprimer des fichiers à l'aide de la commande Linux find
Avec cette méthode, nous pouvons utiliser la commande find exclusivement avec les options appropriées ou en conjonction avec xargs commande 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 sauf .gz
fichiers dans le répertoire courant :
$ find . -type f -not -name '*.gz'-delete


6. Utilisation d'un pipeline et xargs , vous pouvez modifier le cas ci-dessus comme suit :
$ find . -type f -not -name '*gz' -print0 | xargs -0 -I {} rm -v {}


7. Regardons un exemple supplémentaire, la commande ci-dessous effacera tous les fichiers à l'exception de .gz
, .odt
, et .jpg
fichiers dans le répertoire courant :
$ find . -type f -not \(-name '*gz' -or -name '*odt' -or -name '*.jpg' \) -delete


Supprimer des fichiers à l'aide de la variable Bash GLOBIGNORE
Cependant, cette dernière approche ne fonctionne qu'avec bash. Ici, le GLOBIGNORE La variable stocke une liste de modèles séparés par deux-points (noms de fichiers) à ignorer par l'expansion du nom de chemin.
Lecture suggérée : 12 exemples pratiques utiles sur la commande Grep sous Linux
Pour utiliser cette méthode, déplacez-vous dans le répertoire que vous souhaitez nettoyer, puis définissez le GLOBIGNORE variable comme suit :
$ cd test $ GLOBIGNORE=*.odt:*.iso:*.txt
Dans ce cas, tous les fichiers autres que .odt
, .iso
, et .txt
les fichiers seront supprimés du répertoire courant.
Exécutez maintenant la commande pour nettoyer le répertoire :
$ rm -v *
Ensuite, désactivez GLOBIGNORE variables :
$ unset GLOBIGNORE


Remarque :Pour comprendre la signification des drapeaux employés dans les commandes ci-dessus, reportez-vous aux pages de manuel de chaque commande que nous avons utilisées dans les différentes illustrations.
C'est tout! Si vous avez d'autres techniques de ligne de commande en tête dans le même but, n'oubliez pas de nous en faire part via notre section de commentaires ci-dessous.