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

74

Je sais comment supprimer tous les txtfichiers du répertoire actuel rm *.txt. Est-ce que quelqu'un sait comment supprimer tous les fichiers du txtfichier EXCEPT du répertoire courant ?

Arme à feu
la source
21
Comme toujours, testez les réponses avec une commande inoffensive comme lsavant d’essayer d’appeler rm.
Chepner
^ Ce mec n'aime pas vivre dangereusement .. :)
jDub9

Réponses:

111

Vous pouvez utiliser find:

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

Ou les fonctionnalités étendues globbing de bash:

shopt -s extglob
rm *.!(txt)

Ou en zsh:

setopt extendedglob
rm *~*.txt(.)
#  ||     ^^^ Only plain files
#  ||^^^^^ files ending in ".txt"
#  | \Except
#   \Everything
Kevin
la source
Certains d’entre eux devront peut-être être adaptés en fonction de vos dossiers et de ce que vous voulez en faire.
Kevin
1
Ne devrait pas *.!(txt)être !(*.txt)?
Lri
@LauriRanta dépend du contenu du dossier, auquel nous n'avons pas reçu de réponse. C'est bien comme si tous les fichiers avaient des extensions et rms'étoufferaient s'il y avait des dossiers.
Kevin
J'ai un problème avec les crochets. Lorsque j'utilise le style globbing dans un script bash, il se plaint d'une erreur de syntaxe et des parenthèses. Cependant, le faire à partir de la CLI fonctionne.
CMCDragonkai
1
@izogfif vérifie que cela find . -type f ! -name "*.txt" | xargs -r rmfonctionnerait dans GNU \ xargs. La commande xargs BSD et UNIX peut ne pas avoir -r vous devez vérifier votre man xargs
répertoire
10

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

shopt -s extglob
rm !(*.txt)
Kent
la source
10

Si vous souhaitez uniquement 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 des répertoires avec les fichiers, vous pouvez utiliser ceci:

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

Sagar Rakshe
la source
4

Une solution sans find:

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

Cela devrait fonctionner sur toutes sortes de coquilles.

michas
la source
3

Vous pouvez utiliser grep et xargs inversés

ls | grep -v .txt$| xargs rm
rjv
la source
ls | grep -v *.txt | xargs rmfonctionne aussi bien
phillipsk
@phillipsk grep -v *.txtne fonctionnera que s'il y a exactement un .txtfichier. S'il n'y en a pas, greputilisera *.txtcomme motif; s'il y en a plus d'un, il recherchera le premier nom de fichier dans tous les autres .txtfichiers, en ignorant le résultat ls. (Les résultats exacts peuvent dépendre des options de glob du shell.)
JigglyNaga
.txt$correspondra aux chaînes se terminant par txtquel que soit le point. Parce que grepprend l'expression régulière en paramètre. Donc, les fichiers a.txtet aatxtet a-txtseront tous mis en correspondance par cette expression. L'expression correcte devrait être ls | grep -v \\.txt$ | xargs --no-run-if-empty rm. Pour les curieux: Si vous voulez jouer avec l'expression, utilisez cette expression de test en toute sécurité ls | grep \\.txt$ | xargs --no-run-if-empty echo(remarque: il n'y a pas de -vdrapeau et rm=>echo). Note2: vous avez peut-être remarqué une double barre oblique inversée. Une pour regex, une autre pour bash pour échapper à slash.
Dimitry K
1

Faites simplement:

rm $(ls -I "*.txt" ) Type de fichier #Deletes sauf * .txt

De même, s'il est nécessaire de supprimer "sauf un ou plusieurs types de fichiers", procédez comme suit:

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

Surya
la source
Bienvenue sur StackExchange! L' -Ioption pourrait être utile, mais voyez pourquoi ne pas analyser ls . Et à quoi sert-il | xargs? Sans aucun argument, il ne fonctionne que echosur toutes ses entrées.
JigglyNaga
Qu'est-ce qui est xargssupposé atteindre?
dhag
Merci, xargs n'était pas utile dans le cas ci-dessus, corrigé maintenant.
Surya
0

Cela fonctionne aussi pour supprimer tous les fichiers et dossiers cachés (points) sauf celui indiqué ( .mydir):

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