GNU/Linux >> Tutoriels Linux >  >> Linux

3 façons de supprimer tous les fichiers d'un répertoire sauf 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 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 :

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

  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. +(liste de motifs) – 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 à 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.


Linux
  1. Comment supprimer tous les fichiers d'un dossier sauf un fichier spécifique sous Linux

  2. Comment déplacer tous les fichiers (y compris cachés) d'un répertoire à un autre ?

  3. Fichiers Cat avec répertoire ?

  4. Sed :Supprimer toutes les occurrences d'une chaîne, sauf la première ?

  5. Supprimer tous les fichiers d'un dossier sauf le dernier (le plus récent) 20 ?

Supprimer tous les fichiers/répertoires sauf un fichier ?

Supprimer tous les fichiers sauf dans un certain sous-répertoire avec Find ?

Utilisez Rechercher pour trouver certains répertoires et supprimer tous les fichiers qu'il contient sauf un répertoire ?

Déplacer tous les fichiers sauf un

Comment renommer tous les fichiers avec des caractères spéciaux et des espaces dans un répertoire ?

Supprimer tous les dossiers à l'intérieur d'un dossier sauf un avec un nom spécifique