Comment supprimer tous les fichiers sauf un dans Unix?

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

Comment supprimer tout un fichier sauf un (ou un) dans Unix?

Quelque chose comme

rm -rf -ignore myfile.txt * 

 ls * | grep -v dont_delete_this_file | xargs rm -rf 

Exemple :

 mkdir test && cd test touch test1 touch test2 touch test3 touch test4 touch test5 

Pour supprimer tous les fichiers sauf 'test2':

 ls * | grep -v test2 | xargs rm -rf 

Ensuite, la sortie 'ls' est:

 test2 

MODIFIER:

Merci pour le commentaire. Si le répertoire contient certains fichiers avec des espaces:

 mkdir test && cd test touch "test 1" touch "test 2" touch "test 3" touch "test 4" touch "test 5" 

Vous pouvez utiliser (avec bash):

 rm !("test 1"|"test 4") 

Sortie 'ls':

 test 1 test 4 

En supposant que vous utilisez le shell bash (le cas le plus commun), vous pouvez utiliser le symbole négation de globbing (extension de nom de chemin):

 rm -rf !(myfile.txt) 

Cela utilise des globules étendus, donc vous devriez l'activer d'abord:

 shopt -s extglob 
  cp myfile.txt somewhere_else; rm -rf * cp somewhere_else/myfile.txt . 
 ln myfile.txt .myfile.txt && rm -rf * && mv .myfile.txt myfile.txt 

Pour un rm récursif, vous devriez faire la récurrence avec la find et l'exclusion des fichiers que vous souhaitez conserver (ou grep , mais cela peut vous amener à des problèmes d'espace blanc). Pour un shell glob, les shells modernes ont des modèles globaux qui peuvent être utilisés pour exclure les fichiers; Cela peut être combiné avec la récursion de niveau shell-time lorsque disponible (par exemple, zsh a rm **/*~foo/bar – notez qu'il est probable que cela se produise dans les limites de longueur d'argument pour les grands arbres de répertoires).