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
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 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 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 dels
. (Les résultats exacts peuvent dépendre des options globales du shell '.) -
.txt$
correspondra aux chaînes se terminant partxt
quel que soit le point. Parce quegrep
prend lexpression régulière comme paramètre. Ainsi, les fichiersa.txt
etaatxt
eta-txt
seront 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-v
etrm=>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 simplementecho
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")
ls
avant de tenter dappelerrm
.