205 votes

Supprime tous les fichiers sauf certains d'un répertoire

Lorsque vous utilisez sudo rm -r comment puis-je supprimer tous les fichiers, à l'exception de ceux qui suivent :

textfile.txt
backup.tar.gz
script.php
database.sql
info.txt

211voto

awi Points 741
find [path] -type f -not -name 'textfile.txt' -not -name 'backup.tar.gz' -delete

Si vous ne spécifiez pas -type f find listera également les répertoires, ce que vous ne voulez peut-être pas.


Ou une solution plus générale utilisant la très utile combinaison find | xargs :

find [path] -type f -not -name 'EXPR' -print0 | xargs -0 rm --

par exemple, supprimer tous les fichiers non txt dans le répertoire courant :

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

Le site print0 y -0 est nécessaire s'il y a des espaces dans l'un des noms de fichiers à supprimer.

148voto

pl1nk Points 485
rm !(textfile.txt|backup.tar.gz|script.php|database.sql|info.txt)

L'extglob (Extended Pattern Matching) doit être activé dans BASH (s'il ne l'est pas) :

shopt -s extglob

40voto

darioo Points 23903

find . | grep -v "excluded files criteria" | xargs rm

Ceci va lister tous les fichiers dans le répertoire courant, puis tous ceux qui ne correspondent pas à vos critères (attention à la correspondance des noms de répertoire) et ensuite les supprimer.

Mise à jour : basé sur votre édition, si vous voulez vraiment supprimer tout ce qui se trouve dans le répertoire courant sauf les fichiers que vous avez listés, ceci peut être utilisé :

mkdir /tmp_backup && mv textfile.txt backup.tar.gz script.php database.sql info.txt /tmp_backup/ && rm -r && mv /tmp_backup/* . && rmdir /tmp_backup

Il créera un répertoire de sauvegarde /tmp_backup (vous avez les privilèges de Root, n'est-ce pas ?), déplacez les fichiers que vous avez listés dans ce répertoire, supprimez récursivement tout ce qui se trouve dans le répertoire actuel (vous savez que vous êtes dans le bon répertoire, n'est-ce pas ? /tmp_backup et enfin, supprimer /tmp_backup .

Je choisis que le répertoire de sauvegarde soit dans Root, car si vous essayez de tout supprimer récursivement depuis Root, votre système aura de gros problèmes.

Il existe certainement des façons plus élégantes de procéder, mais celle-ci est assez simple.

19voto

theharshest Points 1790

Vous pouvez utiliser la variable d'environnement GLOBIGNORE dans Bash.

Supposons que vous souhaitiez supprimer tous les fichiers, à l'exception de php et sql, vous pouvez procéder comme suit -

export GLOBIGNORE=*.php:*.sql
rm *
export GLOBIGNORE=

En définissant GLOBIGNORE de cette manière, on ignore les caractères de remplacement utilisés par php et sql comme "ls *" ou "rm *". Ainsi, l'utilisation de "rm *" après avoir défini la variable ne supprimera que les fichiers txt et tar.gz.

18voto

Dennis Williamson Points 105818

En supposant que les fichiers portant ces noms existent à plusieurs endroits dans l'arborescence du répertoire et que vous voulez tous les préserver :

find . -type f ! -regex ".*/\(textfile.txt\|backup.tar.gz\|script.php\|database.sql\|info.txt\)" -delete

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X