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!

Vinayak Garg
la source

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.

gniourf_gniourf
la source
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.

Lekensteyn
la source
+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