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 ?
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 ?
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)?
rms'étoufferaient s'il y avait des dossiers.
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
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 rmfonctionne aussi bien
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.)
.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.
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
-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.
xargssupposé atteindre?
Cela fonctionne aussi pour supprimer tous les fichiers et dossiers cachés (points) sauf celui indiqué ( .mydir):
rm -rf $(ls -aI ".mydir")
lsavant d’essayer d’appelerrm.