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 ?
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):
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.
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):
ls
avant d’essayer d’appelerrm
.Réponses:
Vous pouvez utiliser
find
:Ou les fonctionnalités étendues globbing de bash:
Ou en zsh:
la source
*.!(txt)
être!(*.txt)
?rm
s'étoufferaient s'il y avait des dossiers.find . -type f ! -name "*.txt" | xargs -r rm
fonctionnerait dans GNU \ xargs. La commande xargs BSD et UNIX peut ne pas avoir -r vous devez vérifier votreman xargs
il y a plusieurs façons de le faire. mais le moyen le plus simple serait (bash):
la source
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 {} \;
la source
Une solution sans
find
:Cela devrait fonctionner sur toutes sortes de coquilles.
la source
Vous pouvez utiliser grep et xargs inversés
la source
ls | grep -v *.txt | xargs rm
fonctionne aussi biengrep -v *.txt
ne fonctionnera que s'il y a exactement un.txt
fichier. S'il n'y en a pas,grep
utilisera*.txt
comme motif; s'il y en a plus d'un, il recherchera le premier nom de fichier dans tous les autres.txt
fichiers, en ignorant le résultatls
. (Les résultats exacts peuvent dépendre des options de glob du shell.).txt$
correspondra aux chaînes se terminant partxt
quel que soit le point. Parce quegrep
prend l'expression régulière en paramètre. Donc, les fichiersa.txt
etaatxt
eta-txt
seront tous mis en correspondance par cette expression. L'expression correcte devrait êtrels | 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-v
drapeau etrm=>echo
). Note2: vous avez peut-être remarqué une double barre oblique inversée. Une pour regex, une autre pour bash pour échapper à slash.Faites simplement:
rm $(ls -I "*.txt" )
Type de fichier #Deletes sauf * .txtDe 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 & * .pdfla source
-I
option pourrait être utile, mais voyez pourquoi ne pas analyser ls . Et à quoi sert-il| xargs
? Sans aucun argument, il ne fonctionne queecho
sur toutes ses entrées.xargs
supposé atteindre?Cela fonctionne aussi pour supprimer tous les fichiers et dossiers cachés (points) sauf celui indiqué (
.mydir
):la source