Je sais comment supprimer tous les txt
fichiers du répertoire actuel rm *.txt
. Est-ce que quelqu'un sait comment supprimer tous les fichiers du txt
fichier EXCEPT du répertoire courant ?
Je sais comment supprimer tous les txt
fichiers du répertoire actuel rm *.txt
. Est-ce que quelqu'un sait comment supprimer tous les fichiers du txt
fichier EXCEPT du répertoire courant ?
Réponses:
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
*.!(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 votre man xargs
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 {} \;
Vous pouvez utiliser grep et xargs inversés
ls | grep -v .txt$| xargs rm
ls | grep -v *.txt | xargs rm
fonctionne aussi bien
grep -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ésultat ls
. (Les résultats exacts peuvent dépendre des options de glob du shell.)
.txt$
correspondra aux chaînes se terminant par txt
quel que soit le point. Parce que grep
prend l'expression régulière en paramètre. Donc, les fichiers a.txt
et aatxt
et a-txt
seront 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 -v
drapeau 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.
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
-I
option pourrait être utile, mais voyez pourquoi ne pas analyser ls . Et à quoi sert-il | xargs
? Sans aucun argument, il ne fonctionne que echo
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
):
rm -rf $(ls -aI ".mydir")
ls
avant d’essayer d’appelerrm
.