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

414

Comment supprimer en toute sécurité tous les fichiers avec une extension spécifique (par exemple, .bak ) du répertoire en cours 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.

    
posée user216038 15.11.2013 - 14:03
la source

6 réponses

647

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-le avec précaution. Exécuter d'abord:

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

pour voir exactement quels fichiers vous allez supprimer.

En outre, assurez-vous que -delete est le dernier argument dans votre commande. Si vous le mettez avant -name *.bak argument , il supprimera tout .

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

réponse donnée Radu Rădeanu 15.11.2013 - 14:08
la source
32
find . -name "*.bak" -type f -print0 | xargs -0 /bin/rm -f
    
réponse donnée lokers 04.04.2014 - 21:10
la source
28

Commencez par exécuter 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 du shell. Vous pouvez le mettre dans votre .bashrc , puis tous les nouveaux shells démarrés le récupéreront. L'effet de cette commande est que **/ corresponde récursivement aux fichiers du répertoire en cours et de ses sous-répertoires (par défaut, **/ signifie 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).

    
réponse donnée Gilles 15.11.2013 - 19:59
la source
18

La suppression de fichiers n’est pas pour moi 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 package trash-cli fait la même chose que gvfs-trash sans la dépendance sur gvfs.

Donc:

sudo apt-get install trash-cli

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

Comme Eliah Kagan le dit clairement dans de nombreux commentaires, vous pouvez également rendre cette méthode récursive en utilisant 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 fichiers et tous les liens symboliques .bak dans le répertoire en cours ou ses sous-répertoires ou au-dessous.

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

Pour les supprimer, ajoutez un -exec à la commande trash :

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 , ce qui évite les erreurs cannot trash non-existent pour les fichiers .bak dans les répertoires .bak :

find . -name '*.bak' -execdir trash {} +
    
réponse donnée don.joey 15.11.2013 - 14:52
la source
3

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

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

-maxdepth 2 car le répertoire en cours ". " est considéré comme le premier dossier.

    
réponse donnée Hypocritus 26.11.2017 - 18:21
la source
0

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.

    
réponse donnée Vasantha Ganesh K 09.08.2018 - 09:38
la source

Lire d'autres questions sur les étiquettes