59 votes

Comment supprimer tous les fichiers, sauf un fichier nommé, d'un dossier spécifique ?

Voici la situation.

J'ai un répertoire qui contient de nombreux fichiers avec des extensions différentes. Je veux supprimer tous les fichiers sauf un qui porte 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 faire, mais comment puis-je le faire à partir de 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 veux supprimer tous les fichiers en ne gardant que le fichier nommé a.txt .

99voto

Maythux Points 77506

Je suis venu avec cette grande commande simple et facile :

rm !(a.txt)

vous pouvez utiliser ! comme négation

Tester le glob avec echo d'abord, c'est-à-dire

echo !(a.txt)

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

shopt -s extglob

Si tu voulais garder les deux a.txt y b.txt vous pouvez utiliser !(a.txt|b.txt) o !([ab].txt) .

Edit :

de faire rm en travaillant de manière récursive, il suffit d'ajouter -r comme

rm -r !(a.txt)

et aussi, cela fonctionne avec les dossiers. il faut juste changer le nom pour le nom du répertoire, comme pour a_dir

rm -r !(a_dir)

23voto

cosmoscalibur Points 1610

Vous pouvez essayer cette commande :

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

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

12voto

hoblin Points 263

Vous pouvez le faire dans le terminal :

cd dirA 
export GLOBIGNORE=a.txt
rm *
export GLOBIGNORE=

5voto

Thraidh Points 131

Vous pouvez utiliser la commande :

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

Ceci recherchera les fichiers ( -type f ) dans le répertoire actuel, à l'exception du fichier a.txt ( ! -name 'a.txt ) et les supprimera ensuite ( -exec rm -f {} + )

4voto

Tim Points 30349

Utilice find y 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 effectuer une recherche dans le dossier en cours, utilisez . au lieu de "dossier".

Source de base

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X