Comment puis-je supprimer tous les files d'un dossier à l'exception de certains files spécifiés?

Je veux supprimer tous les files dans un directory en ne laissant que quelques files spécifiés, ils n'ont rien en commun par leur nom. Comment pourrais-je y parvenir?

Par exemple, les noms de file que je veux conserver sont:

file_1.png , some_music.mp3 , some_music.mp3

Si vous utilisez bash:

 shopt -s extglob rm !(file1|file2|file3) 

Après le manuel de bash:! !(pattern-list) correspond à tout sauf à l'un des motifs donnés et à la list de motifs est une list d'un ou plusieurs motifs séparés par un | .

Créez un sous-directory tmp , déplacez tous les files que vous voulez conserver dans ce directory et faites ensuite un rm -f * . Cela n'affectera pas le tmp .

Après ça suffit de faire:

 mv tmp/* . rmdir tmp 

(En supposant qu'aucun des files que vous avez déplacés ne commence par un point).

Ceci est l'un des rares cas où il est logique d'utiliser la souris et un browser de files comme Nautilus où vous pouvez réellement pouvez Ctrl -click les quelques files que vous voulez conserver, puis utilisez le menu: Edit -> Invert Selection pour get le d'autres files, puis supprimez-les.

Ajoutez les noms des files que vous souhaitez conserver à un file text, un par ligne. Ce file ne doit pas être dans le directory ou vous devez également append son nom.

Si le nom de votre directory est foo et que le nom du file est bar , procédez comme suit.

 find foo -type f -print0|grep -vzZ -f bar|xargs -0 rm 

Ceci est le suivant:

  1. find -type f search les noms de tous les files de foo et de ses sous-directorys et les imprime en STDOUT. Avec l'option -print0 elle délimite les noms de files avec des octets NUL.
  2. grep -v -f bar exclut tous les noms de files qui correspondent à une ligne dans la barre . Avec l'option -z il traite son input comme un set de lignes délimitées par un octet NUL, avec l'option -Z il délimite sa sortie avec un octet NUL.
  3. xargs rm appelle rm plusieurs resockets pour supprimer les files. Avec l'option -0 il traite son input comme un set de lignes délimitées par un octet NUL.

Cela fonctionne avec des noms de files contenant des espaces blancs.