Commande de suppression des fichiers temporaires se terminant par ~


15

Il y a plusieurs jours, j'ai trouvé cet alias bash utile (contenu de mes ~ / .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 cddans 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é rm~de /home/me, il semble ne rien faire. Ou cela peut prendre beaucoup de temps.

Veuillez me dire pourquoi j'obtiens une erreur et comment y remédier.

Merci!

Réponses:


26

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'

Maintenant, personnellement, je n'aime pas les utilisations inutiles des tuyaux et xargs, donc votre alias serait mieux écrit comme suit:

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

L' -type foption pour ne rechercher que les fichiers (pas les répertoires, les liens, etc.), l' -voption rmpour être verbeux (imprime ce qu'il supprime). Le +à la fin de sorte qu'il finds'exécute rmavec tous les fichiers trouvés (ne génère qu'une seule instance de rm, au lieu d'une par fichier).

Maintenant de man bash:

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

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

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

En outre, comme le mentionne l'autre réponse, vous pouvez utiliser la -deletecommande pour rechercher. Dans ce cas, votre rm~fonction sera:

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

En fait, vous pouvez créer une fonction sympa qui prendra un argument, disons --dry-run, qui ne produira que ce qu'il 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
}

Utilisez ensuite comme:

rm~ --dry-run

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

rm~

lorsque vous êtes satisfait de cela.

Adaptez-vous et étendez-vous à vos besoins!

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


Merci! Cela fonctionne bien et le fonctionnement à sec est extrêmement utile.
Vinayak Garg

2
find -type f -name '*~' -delete(arme de choix, en plus git clean -dfx .)
sehe

2
C'est une solution tellement élégante, j'ai dû me connecter juste pour vous donner des accessoires. +1 à vous, mon bon ami!
CodeChimp

9

*~est développé par le shell avant d'être affecté à votre alias. La mission réelle est:

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

Je suggère d'utiliser des fonctions au lieu d'alias, ceux-ci sont beaucoup plus puissants et plus faciles à gérer en ce qui concerne les guillemets.

Pendant que nous y sommes, supprimez le superflu .(le répertoire courant est impliqué si aucun paramètre n'est donné) et arrêtez d'en abuser xargscar une -deleteoption existe déjà.

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

L' -lsoption est facultative, mais l'ajout vous montrera quels fichiers ont été supprimés.


+1 Merci! Mais où dois-je ajouter cette fonction?
Vinayak Garg

@VinayakGarg Vous pouvez également l'ajouter à votre .bash_aliases, mais je les mets généralement directement dans mon .bashrc.
Lekensteyn
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.