Question Comment puis-je supprimer récursivement tous les fichiers d'une extension spécifique dans le répertoire en cours?


Comment supprimer en toute sécurité tous les fichiers avec une extension spécifique (par ex. .bak) à partir du répertoire actuel et de tous les sous-dossiers en utilisant une seule ligne de commande? Simplement, j'ai peur d'utiliser rm Depuis que je l'ai mal utilisé une fois et maintenant j'ai besoin de conseils.


421
2017-11-15 13:03


origine




Réponses:


Vous n'avez même pas besoin d'utiliser rm dans ce cas, si vous avez peur. Utilisation find:

find . -name "*.bak" -type f -delete

Mais utilisez-le avec précaution. Exécuter d'abord:

find . -name "*.bak" -type f

pour voir exactement quels fichiers vous allez supprimer.

Aussi, sois sûr que -delete est le dernier argument dans votre commande. Si vous le mettez avant le -name *.bak argument, il va tout supprimer.

Voir man find et man rm pour plus d'informations et voir également cette question sur SE:


660
2017-11-15 13:08



Comment est-ce différent de rm *.bak? - sayantankhan
@ Bolt64 Votre rm *.bak ne fonctionnera pas pour les sous-répertoires. - Radu Rădeanu
Avec les paramètres par défaut rm *.bak ne supprimera que tous les fichiers se terminant par .bak dans le répertoire en cours. POUR faire aussi des choses dans les sous-répertoires dont vous avez besoin pour manipuler des globs, utilisez l'option -r ou utilisez l'exemple de recherche. - Hennes
@Hennes Soyez prudent avec rm -r *.bak! Il supprime également les répertoires se terminant par .bak avec tout leur contenu. - Radu Rădeanu
Assure-toi cette -delete est le dernier argument de votre commande. Si vous le mettez avant le -name *.bak argument, ça va tout supprimer. - Michael


find . -name "*.bak" -type f -print0 | xargs -0 /bin/rm -f

32
2018-04-04 19:10



Bienvenue sur askubuntu! Bien que cette réponse soit parfaitement valide, je ne pense pas qu’il y ait un avantage à l’utiliser à la place du -delete drapeau de find. Plus d'informations peuvent être trouvées dans le Entrée de manuels GNU pour la suppression de fichiers avec find. - Glutanimate
vous avez probablement raison, c'est juste une solution alternative, peut-être plus brute;) - lokers
Ce n'est pas seulement une alternative mais un exemple de la façon dont les autres commandes peuvent être combinées avec le tube '|'. +1 - Boris Pavlović
Ces solutions alternatives fonctionnent sur d'autres environnements qui manquent de -delete (comme cygwin) - ciriarte
Je pense que c'est la meilleure réponse ici. - Léo Léopold Hertz 준영


Commencez par lancer la commande shopt -s globstar. Vous pouvez l'exécuter sur la ligne de commande et cela n'aura d'effet que dans cette fenêtre de shell. Vous pouvez le mettre dans votre .bashrc, et tous les nouveaux obus démarrés le ramasseront. L'effet de cette commande est de faire **/ faire correspondre les fichiers du répertoire en cours et de ses sous-répertoires de manière récursive (par défaut, **/ veut dire la même chose que */: uniquement dans les sous-répertoires immédiats). Alors:

rm **/*.bak

(ou gvfs-trash **/*.bak ou ce que vous avez).


28
2017-11-15 18:59





La suppression de fichiers est pour moi pas quelque chose que vous devriez utiliser rm pour. Voici une alternative:

sudo apt-get install gvfs     # install a tool that allows you to put stuff in the trash
alias "trash"="gvfs-trash"    # you can also put this in .bash_aliases or simply use the command without alias
trash *.bak                   # trash the files (thus moving them to the trash bin)

Comme le dit Flimm dans les commentaires:

Le paquet trash-cli fait la même chose que gvfs-trash sans la dépendance sur gvfs.

Alors:

sudo apt-get install trash-cli

Vous n'avez pas besoin de créer un alias pour cela, car trash-cli package fournit une commande trashqui fait ce que nous voulons

Comme Eliah Kagan le dit clairement dans de nombreux commentaires, vous pouvez aussi utiliser cette méthode find. Dans ce cas, vous ne pouvez pas utiliser un alias, donc les commandes ci-dessous supposent que vous avez installé trash-cli. Je résume les commentaires d'Eliah:

Cette commande trouve et affiche tout .bak fichiers et liens symboliques n'importe où dans le répertoire en cours ou ses sous-répertoires ou ci-dessous.

find . -name '*.bak' -xtype f

Pour les supprimer, ajoutez un -exec avec le trash commander:

find . -name '*.bak' -xtype f -exec trash {} +

-xtype f sélectionne les fichiers et les liens symboliques vers les fichiers, mais pas les dossiers. Pour supprimer également les dossiers .bak, supprimez cette partie et utilisez -execdir, qui évite cannot trash non-existent des erreurs pour .bak fichiers à l'intérieur .bak répertoires:

find . -name '*.bak' -execdir trash {} +

19
2017-11-15 13:52



"Ne pas utiliser rm supprimer des choses "est une déclaration controversée mais je dois admettre qu'il est souvent plus sage d'utiliser quelque chose qui vous permettra de défaire des choses. - Oli♦
Le paquet trash-cli fait la même chose que gvfs-trash sans la dépendance sur gvfs. - Flimm
Je l'ai édité dans la réponse, la prochaine fois, n'hésitez pas à faire le montage vous-même. - don.joey
@ don.joey Cette réponse semble dire find . -name "*.bak" -type f affiche ce que trash *.bak supprime. Est-ce vraiment ce que tu veux dire? Vous pouvez déplacer des répertoires vers la corbeille avec trash ou gvfs-trash, mais trash *.bak ne déplacera que les fichiers et répertoires dont les noms se terminent par .bak et qui résident immédiatement dans le répertoire en cours. La coquille se dilate *.bak, alors trash *.bak n'affectera pas .bak fichiers dans les sous-répertoires pas eux-mêmes nommés .bak. - Eliah Kagan
@ don.joey Oui ls *.bak (ce que je pense que vous voulez dire) répertorie trash *.bak corbeilles. find . -name '*.bak' -xtype f -exec trash {} + tous les déchets .bak fichiers n'importe où sous .. Il ne peut pas utiliser un alias, donc installez trash-cli ou écrire gvfs-trash au lieu. Voici un exemple.  -xtype f sélectionne les fichiers et les liens symboliques vers les fichiers, mais pas les dossiers. Supprimer .bak  Dossiers aussi, utiliser find . -name '*.bak' -execdir trash {} +, qui évite cannot trash non existent des erreurs pour .bak fichiers à l'intérieur .bak répertoires. N'hésitez pas à utiliser tout cela dans votre réponse. - Eliah Kagan


Si vous souhaitez supprimer tous les fichiers d'un certain type, mais seulement 1 dossier "profond" du dossier actuel:

find . -maxdepth 2 -name "*.log" -type f -delete

-maxdepth 2 parce que le répertoire actuel "."compte comme le premier dossier.


3
2017-11-26 17:21





Si vous êtes dans un dépôt git, vous pouvez utiliser:

git clean -fdx

Cela supprime les fichiers et fichiers non suivis dans .gitignore.


0
2017-08-09 07:38