3 façons de supprimer tous les fichiers d'un répertoire à l'exception d'un ou 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 à 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 des commandes rm, find et globignore.
Avant d'aller plus loin, commençons par examiner brièvement un concept important sous Linux : la correspondance de 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 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[seq]
– correspond à n'importe quel caractère dans seq[!seq]
– correspond à tout caractère ne figurant pas dans la séquence
Il existe trois méthodes possibles que nous allons explorer ici, notamment :
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- +(pattern-list) – 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 un des modèles donnés
Pour les utiliser, activez l'option 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 filename1 et filename2 :
rm -v !("filename1"|"filename2")
3. L'exemple ci-dessous montre comment supprimer de manière interactive tous les fichiers autres que tous les fichiers .zip
:
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 en cours. fait:
rm -v !(*.zip|*.odt)
Une fois que vous disposez de toutes les commandes requises, désactivez l'option shell extglob 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 la commande xargs en employant 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 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 . Fichiers .jpg
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
Cette dernière approche ne fonctionne cependant qu'avec bash. Ici, la variable GLOBIGNORE stocke une liste de modèles (noms de fichiers) séparés par deux-points à ignorer par l'expansion des noms 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 la variable GLOBIGNORE comme suit :
cd test
GLOBIGNORE=*.odt:*.iso:*.txt
Dans ce cas, tous les fichiers autres que les fichiers .odt
, .iso
et .txt
seront 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 indicateurs utilisé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 les partager avec nous via notre section commentaires ci-dessous.