Recherche de site Web

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 :

  1. * – correspond à zéro ou plusieurs caractères
  2. ? – correspond à n'importe quel caractère
  3. [seq] – correspond à n'importe quel caractère dans seq
  4. [!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 | :

  1. *(pattern-list) – correspond à zéro ou plusieurs occurrences des modèles spécifiés
  2. ?(pattern-list) – correspond à zéro ou une occurrence des modèles spécifiés
  3. +(pattern-list) – correspond à une ou plusieurs occurrences des modèles spécifiés
  4. @(pattern-list) – correspond à l'un des modèles spécifiés
  5. !(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.