Comment supprimer tous les fichiers sauf un fichier nommé d'un dossier spécifique [dupliquer]

46

Voici la situation.

J'ai un répertoire qui contient de nombreux fichiers avec des extensions différentes. Je souhaite supprimer tous les fichiers sauf un avec un nom spécifique.

Cela pourrait être facilement fait en utilisant l'interface graphique en sélectionnant tout et en appuyant sur ctrl et en désélectionnant le fichier en question.

C'est exactement ce que je veux, mais comment puis-je le faire depuis la ligne de commande?

Par exemple: dirA contient les fichiers suivants:

a.txt
b.txt
c.php
d.html
a.db
b.db
e.html

Je souhaite supprimer tous les fichiers en ne conservant que le fichier nommé a.txt .

    
posée Maythux 16.05.2015 - 14:15
la source

5 réponses

80

Je viens avec cette commande simple et facile à utiliser:

rm !(a.txt)

vous pouvez utiliser! comme une négation

Testez le glob avec echo first, c'est-à-dire

echo !(a.txt)

Si cela ne fonctionne pas, pour bash vous devrez peut-être l'activer avec

shopt -s extglob

Si vous souhaitez conserver à la fois a.txt et b.txt , vous pouvez utiliser !(a.txt|b.txt) ou !([ab].txt) .

Modifier:

pour que rm fonctionne de manière récursive, ajoutez simplement -r comme

rm -r !(a.txt)

et aussi, il travaille avec le dossier. juste besoin de changer le nom pour le nom de dir, par exemple pour a_dir

rm -r !(a_dir)
    
réponse donnée Maythux 16.05.2015 - 14:21
la source
17

Vous pouvez essayer cette commande:

find . \! -name 'a.txt' -delete

Mais vous devez faire attention car la commande find est récursive.

    
réponse donnée cosmoscalibur 16.05.2015 - 14:22
la source
10

Vous pouvez le faire dans le terminal:

cd dirA 
export GLOBIGNORE=a.txt
rm *
export GLOBIGNORE=
    
réponse donnée Sharad Gautam 16.05.2015 - 14:28
la source
5

Vous pouvez utiliser la commande:

find ! -name 'a.txt' -type f -exec rm -f {} +

Cela recherchera les fichiers ( -type f ) dans le répertoire en cours à l'exception du fichier a.txt ( ! -name 'a.txt ), puis les supprimera ( -exec rm -f {} + )

    
réponse donnée shaddy 16.05.2015 - 14:20
la source
4

Utilisez find et xargs

find folder -type f -not -name 'a.txt' -print0 | xargs -0 rm

Pour exclure plusieurs choses:

find folder -type f -not -name 'a.txt' -not -name 'b.txt' -print0 | xargs -0 rm

Cela fonctionne également avec les caractères génériques:

find folder -type f -not -name '*.png' -not -name 'b.txt' -print0  | xargs -0 rm

Pour rechercher dans le dossier actuel, utilisez . à la place de 'folder'.

Source de base

    
réponse donnée Tim 16.05.2015 - 14:21
la source

Lire d'autres questions sur les étiquettes