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
Cette page offre une variété d'options selon le shell: http://www.unix.com/unix-dummies-questions-answers/51400-how-remove-all-except-one-file.html
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).