Commande de suppression de fichiers temporaires se terminant par ~

Il y a plusieurs jours, j’ai trouvé cet alias bash utile (contenu de mon ~ / .bash_aliases )

# aliases # finds temporary files ending with '~' and deletes them alias rm~='find . -name '*~' -print0 | xargs -0 /bin/rm -f' 

Maintenant, j’ai essayé d’utiliser rm~ après cd dans un répertoire contenant 3 fichiers se terminant par ~

J’ai eu cette erreur dans le terminal et les fichiers n’ont pas été supprimés

 find: paths must precede expression: 1n.in~ Usage: find [-H] [-L] [-P] [-Olevel] [-D help|tree|search|stat|rates|opt|exec] [path...] [expression] 

Aussi, quand j’ai essayé de rm~ from /home/me , il semble ne rien faire. Ou cela prend peut-être beaucoup de temps.

S’il vous plaît, dites-moi pourquoi je reçois une erreur et comment y remédier.

Merci!

Votre alias bash n’est pas bien écrit (les guillemets simples ne sont pas bien utilisés). Au lieu de cela, il devrait être:

 alias rm~='find . -name "*~" -print0 | xargs -0 /bin/rm -f' 

Personnellement, je n’aime pas les utilisations inutiles des pipes et des xargs , votre alias serait donc mieux écrit:

 alias rm~='find . -name "*~" -type f -exec /bin/rm -fv -- {} +' 

L’option -type f pour ne trouver que les fichiers (pas les répertoires, les liens, etc.), l’option -v pour rm afin d’être verbeuse (affiche ce qu’elle supprime). Le + à la fin pour que find exécute rm avec tous les fichiers trouvés (génère une seule instance de rm au lieu d’une par fichier).

Maintenant de l’ man bash :

Dans presque tous les cas, les alias sont remplacés par des fonctions de shell.

Au lieu d’un alias, il est préférable d’utiliser une fonction: commentez votre alias dans le fichier .bash_aliases (c’est-à-dire, mettez un # devant cette ligne) et dans le fichier .bashrc , mettez cette fonction (n’importe où dans le fichier, à la fin est bien):

 rm~() { find . -name "*~" -type f -exec /bin/rm -fv -- {} + } 

En outre, comme l’indique l’autre réponse, vous pouvez utiliser la commande -delete pour rechercher. Dans ce cas, votre fonction rm~ sera:

 rm~() { find . -name "*~" -type f -printf "Removing file %p\n" -delete } 

En fait, vous pouvez créer une fonction intéressante qui prendra un argument, par exemple --dry-run , qui ne produira que ce qu’elle supprimera:

 rm~() { case "$1" in "--dry-run") find . -name "*~" -type f -printf "[dry-run] Removing file %p\n" ;; "") find . -name "*~" -type f -printf "Removing file %p\n" -delete ;; *) echo "Unsupported option \`$1'. Did you mean --dry-run?" ;; esac } 

Puis utilisez comme:

 rm~ --dry-run 

pour afficher uniquement les fichiers qui seront supprimés (mais pas les supprimer), puis

 rm~ 

quand vous êtes heureux avec cela.

Adapter et étendre à vos besoins!

Remarque. Vous devrez ouvrir un nouveau terminal pour que les modifications prennent effet.

*~ est développé par le shell avant qu’il ne soit assigné à votre alias. La mission actuelle est:

 alias rm~='find .name some~ file~ 1n.in~ -print0 | xargs -0 /bin/rm -f' 

Je suggère d’utiliser des fonctions plutôt que des alias, ceux-ci sont beaucoup plus puissants et faciles à gérer en ce qui concerne les guillemets.

Pendant que nous y sums, retirez le superflu . (le répertoire courant est impliqué si aucun paramètre n’est fourni) et arrête d’abuser de xargs car une option -delete existe déjà.

 rm~() { find -name '*~' -ls -delete; } 

L’option -ls est facultative, mais son ajout vous indiquera quels fichiers ont été supprimés.