web-dev-qa-db-fra.com

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

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

498
user216038

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 en premier:

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

pour voir exactement quels fichiers vous allez supprimer.

En outre, assurez-vous que -delete est le dernier argument de votre commande. Si vous le mettez avant le -name *.bak argument, , tout sera supprimé .

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

794
Radu Rădeanu
find . -name "*.bak" -type f -print0 | xargs -0 /bin/rm -f
37
lokers

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 la fenêtre du shell. Vous pouvez le mettre dans votre .bashrc et tous les shells nouvellement démarrés le récupéreront. Cette commande a pour effet de faire correspondre **/ aux fichiers du répertoire en cours 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 ce que vous avez).

31
Gilles

Pour moi, la suppression de fichiers n’est pas quelque chose que vous devriez utiliser rm. 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 paquetage 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 le paquetage trash-cli 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. 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 fichiers et liens symboliques .bak situés n'importe où dans le répertoire en cours ou dans ses sous-répertoires ou en dessous.

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

Pour les supprimer, ajoutez un -exec avec 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 {} +
20
don.joey

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 car le répertoire actuel "." compte comme premier dossier.

3
Hypocritus

Réponse rapide:

  • Supprimez tous les fichiers portant le nom considéré ou postfix de manière récursive:

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

  • Supprimez tous les répertoires avec le nom considéré récursivement:

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

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

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

[NOTE]:

d est une option de répertoire et f est une option de fichier.

0
Benyamin Jafari

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

git clean -fdx

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

0
Vasantha Ganesh K