788 votes

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

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

1270voto

Radu Rădeanu Points 156862

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

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

Mais utilisez-la avec précaution. Courez d'abord :

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

pour voir exactement quels fichiers vous allez supprimer.

Aussi, s'assurer que -delete est le dernier argument dans votre commandement. Si vous le mettez avant le -name *.bak argument , cela va tout effacer .

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

56voto

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

48voto

Schof Points 952

Exécutez d'abord la commande shopt -s globstar . Vous pouvez exécuter cela sur la ligne de commande, et cela n'aura d'effet que dans cette fenêtre Shell. Vous pouvez le mettre dans votre .bashrc et tous les obus nouvellement lancés le reprendront. L'effet de cette commande est de rendre **/ correspond aux fichiers du répertoire courant et de ses sous-répertoires de manière récursive (par défaut, **/ signifie la même chose que */ : uniquement dans les sous-répertoires immédiats). Ensuite :

rm **/*.bak

(ou gvfs-trash **/*.bak ou quoi que ce soit d'autre).

25voto

don.joey Points 26933

Pour moi, la suppression de fichiers n'est 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 à gvfs.

Donc :

sudo apt-get install trash-cli

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

Comme Eliah Kagan l'explique clairement dans des commentaires détaillés, vous pouvez également rendre cette méthode récursive en utilisant les éléments suivants find . Dans ce cas, vous ne pouvez pas utiliser d'alias, donc les commandes ci-dessous supposent que vous avez installé trash-cli . Je résume les commentaires d'Eliah :

Cette commande recherche et affiche tous les .bak les fichiers et les liens symboliques n'importe où dans le répertoire actuel ou ses sous-répertoires ou en dessous.

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

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

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 aussi les dossiers .bak, supprimez cette partie, et utilisez -execdir ce qui permet d'éviter cannot trash non-existent des erreurs pour .bak fichiers à l'intérieur .bak les répertoires :

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

7voto

R Hill Points 789

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

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

-profondeur maximale 2 car le répertoire courant " . "compte comme le premier dossier.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X