Comment supprimer tous les fichiers d'un dossier à l'exception de certains fichiers spécifiés?


11

Je veux supprimer tous les fichiers d'un répertoire en ne laissant que certains fichiers spécifiés, ils n'ont rien en commun par leur nom. Comment pourrais-je y parvenir?

Par exemple, les noms de fichiers que je souhaite conserver sont:

file_1.png, another_file.jpg,some_music.mp3

Réponses:


15

Si vous utilisez bash:

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

La première ligne active simplement la correspondance de modèle étendue, et après cela, nous utilisons l'un d'eux:

!(pattern-list) correspond à tout sauf à l'un des modèles donnés

et la liste de motifs est une liste d'un ou plusieurs motifs séparés par un |.


Ou avec zsh

setopt extendedglob
rm -- ^(file1|file2)

Ou, plus portable, en utilisant find:

find . -maxdepth 1 ! -name 'file1' ! -name 'file2' -type f -exec rm -v {} +

3
Il peut être utile d'indiquer comment renvoyer le comportement facultatif du shell back ( shopt -u extglob).
geedoubleya

7

Créez un sous-répertoire tmp, déplacez tous les fichiers que vous souhaitez conserver dans ce répertoire et effectuez une opération rm -f *ultérieure. Cela n'affectera pas le tmprépertoire.

Après cela, faites simplement:

mv tmp/* .
rmdir tmp

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

C'est l'un des rares cas où il est logique d'utiliser la souris et un navigateur de fichiers comme Nautilus où vous pouvez réellement Ctrlcliquer sur les quelques fichiers que vous souhaitez conserver, puis utiliser le menu: Edit -> Invert Selectionpour obtenir les autres fichiers, puis supprimez-les. .


le déplacement des fichiers vers le répertoire tmp semble agréable. Quoi qu'il en soit, je dois le faire avec la ligne de commande. Merci!
AGamePlayer

3
@AwQiruiGuo Le tmp a l'avantage de séparer d'abord les fichiers en deux ensembles, avant de supprimer irrévocablement ceux dont vous ne voulez pas. Vous pouvez donc exécuter un lspour voir si vous n'avez raté aucun des fichiers que vous souhaitez conserver.
Anthon

2

Ajoutez les noms des fichiers que vous souhaitez conserver à un fichier texte, un par ligne. Ce fichier ne doit pas se trouver dans le répertoire ou vous devez également ajouter son nom.

Si le nom de votre répertoire est foo et le nom du fichier est bar , procédez comme suit.

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

Cela fait ce qui suit:

  1. find -type frecherche les noms de tous les fichiers dans foo et ses sous-répertoires et les imprime dans STDOUT. Avec option, -print0il délimite les noms de fichiers avec des octets NUL.
  2. grep -v -f barexclut tous les noms de fichiers qui correspondent à une ligne dans la barre . Avec l'option, -zil traite son entrée comme un ensemble de lignes délimitées par l'octet NUL, avec l'option, -Zil délimite sa sortie avec un octet NUL.
  3. xargs rmappelle à rmplusieurs reprises pour supprimer les fichiers. Avec l'option, -0il traite son entrée comme un ensemble de lignes délimitées par l'octet NUL.

Cela fonctionne avec les noms de fichiers contenant des espaces blancs.


Cela ne fonctionnera pas car les noms de fichiers peuvent contenir des retours à la ligne.
Anthon

@Anthon a changé les options de find, grep, xargs pour faire face aux noms de fichiers contenant des espaces, y compris la nouvelle ligne
Mathias Weidner

Si vous voulez utiliser, findje préfère le fairefind . -maxdepth 1 ! -name 'file1' ! -name 'file2' -type f -exec rm -vi {} +
jimmij
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.