2013-01-08 12:17:05 +0000 2013-01-08 12:17:05 +0000
123
123

Comment supprimer tous les fichiers d'un répertoire à l'exception de certains ?

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

Réponses (17)

144
144
144
2013-01-08 12:34:49 +0000

A rm tous sauf u,p en bash tapez juste :

rm !(u|p)

Cela nécessite de définir l'option suivante :

shopt -s extglob

En savoir plus : glob - Wiki de Greg

108
108
108
2013-01-08 12:18:23 +0000

Dans ce cas, je tape

rm *

Puis j'appuie sur Ctrl+X,* pour expansion * dans tous les noms de fichiers visibles.

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

71
71
71
2013-01-08 12:35:05 +0000

Vous pouvez utiliser find

find . ! -name u ! -name p -maxdepth 1 -type f -delete
  • ! annule l'expression suivante
  • -name spécifie un nom de fichier
  • -maxdepth 1 fera traiter le répertoire spécifié uniquement (find par défaut traverse les répertoires)
  • -type f traitera uniquement les fichiers (et pas par exemple les répertoires)
  • -delete supprimera les fichiers

Vous pouvez alors régler les conditions en regardant la page de manuel de find

Mise à jour

  • Gardez à l'esprit que l'ordre des éléments des expressions est significatif (voir la documentation)
  • Testez d'abord votre commande en utilisant -print au lieu de -delete.
43
43
43
2013-01-08 12:22:58 +0000

Simple :

mv les fichiers que vous voulez dans un répertoire supérieur, rm le répertoire et puis mv les récupérer.

15
15
15
2013-01-08 14:22:21 +0000

Quelque peu similaire à cette réponse mais aucune option spéciale n'est nécessaire, pour autant que je sache ce qui suit est une fonctionnalité “ancienne” supportée par tout shell (vaguement) /bin/sh ressemblant (par exemple, bash, zsh, ksh, etc)

rm [^up]
```.
11
11
11
2013-01-09 03:54:14 +0000

Le faire sans trouver :

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

(Edit : “u” et “v”, comme à d'autres endroits ici, sont utilisés comme versions génériques de regexes entières. Il est évident que vous devrez faire attention à ancrer vos regexes pour éviter de faire correspondre trop de choses).

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

6
6
6
2013-01-09 22:34:13 +0000

Dans zsh :

setopt extended_glob # probably in your .zshrc

alors

rm ^(u|p)

ou

rm *~(u|p)

Le deuxième fonctionnera même si vous avez ^ dans $histchars pour la substitution de l'histoire, et bien sûr vous pouvez mettre un globe arbitraire avant le ~.

5
5
5
2013-01-08 16:32:06 +0000

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

GLOBIGNORE=u:p
rm *
```.
3
3
3
2013-01-08 17:58:46 +0000
find . -maxdepth 1 ! -name "u" ! -name "p" -type f -exec rm -rf {} \;

Cela supprimera tous les fichiers sauf u et p en unix

3
3
3
2013-01-08 17:02:15 +0000

À l'époque des disquettes, j'avais un exécutable dos appelé “Except” qui déplaçait temporairement les choses hors du répertoire courant et exécutait une commande, pour ainsi dire :

except \*.txt del \*.\*

pour supprimer tout sauf vos fichiers texte.

Ce serait une chose assez triviale à mettre en œuvre en tant que script shell et si c'est le genre de chose que vous êtes susceptible de faire plus de deux fois, il semble que ce soit une bonne idée.

2
2
2
2013-01-08 18:16:45 +0000

Pour ceux qui préfèrent spécifier des motifs d'exclusion complexes arbitraires (couvrant tous les noms de fichiers concernés) dans un style regexp emacs, posix-awk ou posix-extended (voir la page de manuel), je recommande celui-ci. Il exclut u et p dans le répertoire courant dans cet exemple. Cela peut être pratique pour les scripts.

find -regextype posix-awk ! -regex './(u|p)' -print0 | xargs -0 rm -rf
1
1
1
2014-09-24 03:05:26 +0000

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 s'adapter à un nombre arbitraire d'arguments, mais cela fonctionne bien.

Et c'est de la pure bonté.

1
1
1
2014-10-22 12:37:57 +0000

Voici une autre variante. Vous pouvez taper :

rm -i *

ou :

rm --interactive *

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

1
1
1
2016-09-11 02:33:03 +0000

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
1
1
2013-01-09 20:54:59 +0000

Je l'utilise toujours :

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

Cela vous permettra de définir le degré de granularité que vous souhaitez obtenir. Ainsi, si vous voulez supprimer les fichiers a à o et Z, vous pouvez les utiliser :

rm [a-o,z]*
1
1
1
2013-04-01 12:44:13 +0000

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 incluant des espaces.

0
0
0
2013-10-22 07:06:44 +0000

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