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

Je sais comment supprimer tous les fichiers txt du répertoire actuel par rm *.txt. Quelquun sait-il comment supprimer tous les fichiers du répertoire courant SAUF txt fichier?

Commentaires

  • As toujours, testez les réponses données avec une commande inoffensive comme ls avant de tenter dappeler rm.
  • ^ Ceci mec naime pas ' vivre dangereusement .. 🙂

Réponse

Vous pouvez utiliser find:

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

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

shopt -s extglob rm *.!(txt) 

Ou en zsh:

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

Commentaires

  • Certains dentre eux devront peut-être être adaptés selon que vous avez des dossiers et ce que vous voulez en faire.
  • Ne devrait pas ' t *.!(txt) be !(*.txt)?
  • @LauriRanta dépend de ce que ' s dans le dossier, que nous avons ' Je nai pas obtenu de réponse. Cela ' est parfait si tous les fichiers ont des extensions, et rm sétoufferait sil y avait des dossiers.
  • Jai ' un problème avec les crochets. Lorsque jutilise le style de globbing dans un script bash, il se plaint dune erreur de syntaxe et des parenthèses. Cependant, le faire à partir de la CLI fonctionne.
  • @izogfif vérifiez que find . -type f ! -name "*.txt" | xargs -r rm fonctionnerait dans GNU \ xargs. Les commandes BSD et UNIX xargs peuvent ne pas avoir -r vous devez vérifier votre man xargs

Réponse

Si vous souhaitez simplement supprimer tous les fichiers sauf « * .txt », vous pouvez utilisez la commande suivante:

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

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

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

Réponse

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

shopt -s extglob rm !(*.txt) 

Commentaires

  • Comment puis-je utiliser ceci pour spécifier plusieurs extensions?
  • shopt -s extglob est puissant. tecmint.com/… fournit de bons exemples. Pour supprimer toutes sauf certaines extensions, rm -v !(*.zip|*.odt) fonctionne.

Réponse

Vous pouvez utiliser grep et xargs inversés

ls | grep -v .txt$| xargs rm 

Commentaires

  • ls | grep -v *.txt | xargs rm fonctionne aussi bien
  • @phillipsk grep -v *.txt ne fonctionnera que si ' est exactement un fichier .txt. Sil ny en a pas, grep utilisera *.txt comme modèle; sil y a plus dun ', il recherchera le premier nom de fichier dans tous les autres fichiers .txt, en ignorant la sortie de ls. (Les résultats exacts peuvent dépendre des options globales du shell '.)
  • .txt$ correspondra aux chaînes se terminant par txt quel que soit le point. Parce que grep prend lexpression régulière comme paramètre. Ainsi, les fichiers a.txt et aatxt et a-txt seront tous mis en correspondance par cette expression. Lexpression correcte doit être ls | grep -v \\.txt$ | xargs --no-run-if-empty rm. Pour les curieux: si vous voulez jouer avec lexpression en toute sécurité, utilisez cette expression de test ls | grep \\.txt$ | xargs --no-run-if-empty echo (note: il ny a ' aucun -v et rm=>echo). Note 2: vous avez peut-être remarqué une double barre oblique inverse. Lun est pour les regex, lautre pour bash pour échapper la barre oblique.

Answer

Une solution sans find:

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

Cela devrait fonctionner sur tous les types de shells.

Réponse

Faites simplement:

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

De même, si vous devez 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

Commentaires

  • Bienvenue dans StackExchange!Loption -I peut être utile, mais voyez pourquoi ne pas analyser les ls . Et à quoi sert | xargs? Sans aucun argument, il exécute simplement echo sur toutes ses entrées.
  • Quest-ce que xargs est censé réaliser?
  • Merci, xargs nétait pas utile dans le cas ci-dessus, a corrigé maintenant.

Réponse

Cela fonctionne également pour supprimer tous les fichiers et dossiers hidden (dot) à lexception de celui indiqué (.mydir):

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

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *