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 ?


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

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)

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 {} \;


4

Une solution sans find:

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

Cela devrait fonctionner sur toutes sortes de coquilles.


3

Vous pouvez utiliser grep et xargs inversés

ls | grep -v .txt$| xargs rm

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


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")
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.