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.
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:
find . -name "*.bak" -type f -print0 | xargs -0 /bin/rm -f
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).
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 quegvfs-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 {} +
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.
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.
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.