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
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
rmsé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 rmfonctionnerait dans GNU \ xargs. Les commandes BSD et UNIX xargs peuvent ne pas avoir -r vous devez vérifier votreman 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 extglobest 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 rmfonctionne aussi bien - @phillipsk
grep -v *.txtne fonctionnera que si ' est exactement un fichier.txt. Sil ny en a pas,greputilisera*.txtcomme modèle; sil y a plus dun ', il recherchera le premier nom de fichier dans tous les autres fichiers.txt, en ignorant la sortie dels. (Les résultats exacts peuvent dépendre des options globales du shell '.) -
.txt$correspondra aux chaînes se terminant partxtquel que soit le point. Parce quegrepprend lexpression régulière comme paramètre. Ainsi, les fichiersa.txtetaatxteta-txtseront tous mis en correspondance par cette expression. Lexpression correcte doit êtrels | 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 testls | grep \\.txt$ | xargs --no-run-if-empty echo(note: il ny a ' aucun-vetrm=>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
-Ipeut être utile, mais voyez pourquoi ne pas analyser les ls . Et à quoi sert| xargs? Sans aucun argument, il exécute simplementechosur toutes ses entrées. - Quest-ce que
xargsest 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")
lsavant de tenter dappelerrm.