Supprimez tous les fichiers à l'exception de quelques-uns, à partir d'un dossier dans Unix

Duplication possible:
Comment supprimer tous les fichiers dans un répertoire sauf certains?

Je suis souvent confronté à ce problème. J'ai un ensemble de fichiers dans un dossier et j'aimerais les supprimer tous sauf quelques-uns.

Par exemple: j'ai des fichiers nommés selon la date de création (comme 11-1-11.tar, 10-1-11.tar et ainsi de suite). Maintenant, je voudrais supprimer des fichiers comme 10-1-11, 9-1-11 et ainsi de suite, mais pas d'autres fichiers. En gros, j'aimerais faire respecter ce que tout devrait être supprimé et ce qu'il faut retenir. Comment ferais-je cela?

Si c'est BASH, vous pourriez envisager d'utiliser des globules étendus. Autoriser:

shopt -s extglob

(Mettez cela dans votre .bashrc si vous le souhaitez, ou allumez-le lorsque vous en avez besoin.)

Et puis, par exemple, pour supprimer tous les fichiers sauf le nom du fichier1 et le nom du fichier2

rm !(filename1|filename2)

Vous pouvez également utiliser des caractères génériques comme * là aussi.

Ou vous pouvez supprimer tous ceux qui correspondent à un motif:

rm +([0-9])-+([0-9])-+([0-9]).tar

Supprimerait tous les fichiers # – # – #. Tar (où les nombres ont un ou plusieurs chiffres).

On ne sait pas si cela répondrait à vos besoins ou pas. Plus de détails ici .

Si le nom du fichier correspond à la date de création du fichier, il peut être plus facile de supprimer des fichiers plus anciens qu'un certain jour.

Ceci est facilement réalisé avec la commande find:

  Find / home / john / files -type f -mtime +30 -delete 

Cela supprime les fichiers sous /home/john/files qui ont une date de modification plus longue qu'il y a 30 jours.

Vous pouvez également faire ce que vous voulez avec tmpwatch

http://linux.about.com/library/cmd/blcmdl8_tmpwatch.htm

 tmpwatch -m 24 /path/to/dir 

Supprimera tous les fichiers dans le répertoire plus d'un jour depuis la dernière utilisation (-m).

Je pense que vous pouvez utiliser plusieurs commandes UNIX dans un seul tuyau et cela résoudra votre problème. L'une des solutions possibles consiste à find | grep | xargs rm -rf find | grep | xargs rm -rf find | grep | xargs rm -rf . Par exemple:

$ find /path/to/directory/tree -type f | grep -v -E -f /path/to/exclude/file | xargs rm -rf

Pour exclure certains fichiers, il suffit de mettre leur nom dans fichier /path/to/exclude/file . Par exemple:

 very_useful_file.tar.gz very_important_file.jpg 

Pour éviter l'effacement incorrect de fichiers importants, je suggère de créer une copie de sauvegarde de tous les fichiers. Il est également utile d'utiliser xargs avec l'option -p , qui ...Prompt the user about whether to run each command line and read a line from the terminal.

Il est possible d'utiliser l'outil find sans grep / xargs. Ce sera quelque chose comme ça: find /path/to/tree -type f ! -name "exlude_pattern" find /path/to/tree -type f ! -name "exlude_pattern"

Avant d'utiliser ces commandes, lisez attentivement les pages de manuel pour find/grep/xargs ! Ils peuvent être très dangereux :).