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

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

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

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

Mais utilisez-le avec précaution. Courir en premier:

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

pour voir exactement quels fichiers vous allez supprimer.

Également, assurez-vous que -delete est le dernier argument sous vos ordres. Si vous le mettez avant le -name *.bak argument, il supprimera tout.

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

 < code>trouver . -nom "*.bak " - type f-print0 | xargs -0 / bin / rm-f
< / code>< / pre>

Exécutez d'abord 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 shell. Vous pouvez le mettre dans votre .bashrc, et puis tous les obus nouvellement lancés le ramasseront. L'effet de cette commande est de rendre **/ faire correspondre les 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). Puis:

rm **/*.bak

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

La suppression de fichiers n'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 trashalias "trash"="gvfs-trash"    # you can also put this in .bash_aliases or simply use the command without aliastrash *.bak                   # trash the files (thus moving them to the trash bin)

Comme l'indique Flimm dans les commentaires:

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

Si:

sudo apt-get install trash-cli

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

Comme Eliah Kagan le précise dans de nombreux commentaires, vous pouvez également rendre cela récursif 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 trouve et affiche tous les .bak fichiers et liens symboliques n'importe où dans le répertoire courant ou ses sous-répertoires ou en dessous.

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

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

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

-xtype f sélectionne les fichiers et les liens symboliques vers les fichiers, mais pas les dossiers. Supprimer .les dossiers bak aussi, supprimez cette partie et utilisez -execdir, ce qui évite cannot trash non-existent erreurs pour .bak fichiers à l'intérieur .bak annuaire:

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

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.

Réponse Rapide:

  • Supprimez récursivement tous les fichiers portant le nom ou le suffixe considéré:

    find . -name '*.pyc' -type f -delete

  • Supprimez récursivement tous les répertoires portant le même nom:

    find ~ -path '*/__pycache__/*' -delete‍‍‍find ~ -type d -name '__pycache__' -empty -delete‍‍‍

    Un peu moins étroitement contrôlé, mais en une seule ligne:

    find ~ -path '*/__pycache__*' -delete

[NOTE]:

d est l'option de répertoire et f est l'option de fichier.

Vous pouvez d'abord lister tous les fichiers avec cette extension avant de les utiliser rmExemple,

ls *.bak

Si vous obtenez uniquement les fichiers que vous souhaitez supprimer, vous pouvez utiliser le rm

rm *.bak

Si vous souhaitez vérifier la liste avant de supprimer les fichiers, vous pouvez la faire écho.

find . -name "*.bak" -type f | xargs echo rm -rf

Cela listera les résultats de recherche qui sont redirigés vers la commande rm via xargs.Une fois que vous êtes sûr de la liste, vous pouvez déposer la commande echo in ci-dessus.

find . -name "*.bak" -type f | xargs rm -rf

Related post- Comment supprimer récursivement des répertoires avec un caractère générique?