web-dev-qa-db-fra.com

Comment supprimer tous les fichiers d'un répertoire sauf certains?

Je dois supprimer tous les fichiers d'un répertoire, mais en exclure certains. Par exemple, dans un répertoire contenant les fichiers a b c ... z, je dois tout supprimer, à l'exception de u et p. Y a-t-il un moyen facile de faire ceci?

122
Ashot

Ce que je fais dans ces cas est de taper

rm *

Puis je presse Ctrl+X,* to expand* dans tous les noms de fichiers visibles.

Ensuite, je peux simplement supprimer les deux fichiers que je souhaite garder de la liste et enfin exécuter la ligne de commande.

109
Der Hochstapler

Pour rm tous sauf u,p dans Bash, tapez simplement:

rm !(u|p)

Cela nécessite la configuration de l'option suivante:

shopt -s extglob

Voir plus: glob - Greg's Wiki

144
sparkie

Vous pouvez utiliser find

find . ! -name u ! -name p -maxdepth 1 -type f -delete
  • ! nie la prochaine expression
  • -name spécifie un nom de fichier
  • -maxdepth 1 fera en sorte que le processus de recherche ne contienne que le répertoire spécifié (find traverse par défaut les répertoires)
  • -type f traitera uniquement les fichiers (et non par exemple les répertoires)
  • -delete va supprimer les fichiers

Vous pouvez ensuite régler les conditions en consultant la page de manuel de find

Mise à jour

  • Gardez à l'esprit que l'ordre des éléments des expressions est important (voir la documentation)
  • Testez d'abord votre commande en utilisant -print au lieu de -delete

    find . ! -name u ! -name p -maxdepth 1 -type f -print
    
71
Matteo

Simple:

mv les fichiers que vous voulez dans un répertoire supérieur, rm le répertoire, puis mv leur retour.

43
user176581

Un peu similaire à cette réponse mais aucune option spéciale n’est nécessaire, pour autant que je sache, la fonctionnalité suivante est une fonctionnalité "ancienne" prise en charge par tout/bin/sh qui ressemble à Shell (par exemple, bash, zsh, ksh, etc.)

rm [^up]
15
hlovdal

Le faire sans trouver:

ls | grep -v '(u|p)' | xargs rm

(Edit: "u" et "v", comme dans d'autres endroits ici, sont utilisés comme versions génériques de expressions rationnelles entières. Évidemment, vous voudrez bien faire attention à ancrer vos expressions rationnelles pour éviter de faire correspondre trop d'éléments.)

Vous allez certainement vouloir un script si vous allez faire beaucoup de cela, comme d'autres l'ont suggéré.

11
tquid

En zsh:

setopt extended_glob  # probably in your .zshrc

puis

rm ^(u|p)

ou

rm *~(u|p)

La seconde fonctionnera même si vous avez ^ dans $histchars pour la substitution d’historique, et vous pouvez bien sûr placer un glob arbitraire avant le ~.

6
poolie

GLOBIGNORE prend une liste séparée par deux points

GLOBIGNORE=u:p
rm *
5
W_Whalley

À l'époque des disquettes, j'avais un exécutable DOS appelé "Except" qui déplaçait temporairement les éléments du répertoire en cours et exécutait une commande. Vous pouviez donc dire:

 sauf * .txt del *. * 

pour tout supprimer sauf vos fichiers texte.

Ce serait une chose assez triviale à implémenter en tant que script Shell et si c'est le genre de chose que vous ferez probablement plus de deux fois, cela semble être une bonne idée.

3
Bill K
 find . -maxdepth 1 ! -name "u" ! -name "p" -type f -exec rm -rf {} \;

Cela supprimera tous les fichiers sauf u et p sous unix

3
user1803687

Pour ceux qui préfèrent spécifier des motifs d'exclusion complexes arbitraires (couvrant tous les noms de fichiers affectés) dans un style reacxp complet, emacs, posix-awk ou posix-extended (voir la page de manuel find), je recommanderais celui-ci. Il exclut u et p du répertoire en cours dans cet exemple. Cela peut être utile pour les scripts.

find -regextype posix-awk ! -regex './(u|p)' -print0 | xargs -0 rm -rf
2
sparkie

Encore un autre:

for FILE in ./*; do if [[ $FILE != ./u* ]] || [[ $FILE != ./p* ]];then rm $FILE; fi; done;

C'est un peu long et je ne sais pas si vous pourriez facilement en faire une fonction qui pourrait facilement contenir un nombre arbitraire d'arguments, mais cela fonctionne bien.

Et c'est de la pure bonté.

1
dylnmc

Utilisation:

find . -type f ! -name 'u' ! -name 'p' ! -name '*.ext' -delete
find . -type d ! -name 'u' ! -name 'p' ! -name '*.ext' -delete

afin de supprimer tous les fichiers, y compris les répertoires, à l'exception des fichiers u, p et .ext.

1
Renzo Fabián

Voici une autre variante. Vous pouvez taper:

rm -i *

ou:

rm --interactive *

Donc, rm vous demandera de confirmer la suppression de chaque fichier.

1
idzikovsky

Encore une autre version utilisant xargs:

ls -1 | grep -v do_not_delete | xargs -I files rm "files"

Notez que xargs -I est nécessaire pour gérer correctement les noms de fichiers, y compris les espaces.

1
sebhofer

J'utilise toujours:

rm [a-o,q-t,v-z]*

Cela vous permettra de définir la granularité souhaitée. Donc, si vous souhaitez supprimer les fichiers O et Z, vous pouvez utiliser:

rm [a-o,z]*
1
J Baron

Un moyen simple et difficile à gâcher: disons que vous voulez tout supprimer sauf * .pdf:

mkdir tmp
mv *.pdf tmp
rm *
mv tmp/* .
rm -r tmp
0
talloaktrees