web-dev-qa-db-fra.com

Sous linux, comment supprimer tous les fichiers SAUF le motif * .txt?

Je sais comment supprimer tous les fichiers txt dans le répertoire actuel par rm *.txt. Est-ce que quelqu'un sait comment supprimer tous les fichiers du répertoire courant SAUF txt fichier?

86
Firegun

Vous pouvez utiliser find:

find . -type f ! -name '*.txt' -delete

Ou les fonctionnalités de globbing étendues de bash:

shopt -s extglob
rm *.!(txt)

Ou en zsh:

setopt extendedglob
rm *~*.txt(.)
#  ||     ^^^ Only plain files
#  ||^^^^^ files ending in ".txt"
#  | \Except
#   \Everything
122
Kevin

Si vous souhaitez simplement supprimer tous les fichiers sauf '* .txt', vous pouvez utiliser la commande suivante:

$ find . -type f ! -name "*.txt" -exec rm -rf {} \;

mais si vous souhaitez également supprimer répertoires avec les fichiers, vous pouvez utiliser ceci:

$ find . ! -name "*.txt" -exec rm -r {} \;

14
Sagar Rakshe

il y a plusieurs façons de le faire. mais le moyen le plus simple serait (bash):

shopt -s extglob
rm !(*.txt)
11
Kent

Une solution sans find:

mv dir/*.txt otherdir/
rm -r dir
mv otherdir dir

Cela devrait fonctionner sur toutes sortes de coques.

4
michas

Vous pouvez utiliser grep inversé et xargs

ls | grep -v .txt$| xargs rm
4
rjv

Faites simplement:

rm $(ls -I "*.txt" )# Supprime le type de fichier sauf * .txt

De même, si vous avez besoin de supprimer "sauf un ou plusieurs types de fichiers", procédez comme suit:

rm $(ls -I "*.txt" -I "*.pdf" ) #Types de fichiers supprimés sauf * .txt & * .pdf

2
Surya

Cela fonctionne également pour supprimer tous les fichiers et dossiers cachés (point) à l'exception de ceux indiqués (.mydir):

rm -rf $(ls -aI ".mydir")
0
Chetabahana