Comando para eliminar archivos temporales que terminan en ~


15

Hace muchos días, encontré este útil alias bash (contenido de mis ~ / .bash_aliases )

# aliases

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

Ahora intenté usar rm~después cdun directorio que contenía 3 archivos que terminaban en~

Recibí este error en la terminal y los archivos no se eliminaron

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

También cuando traté rm~de /home/me, parece no estar haciendo nada. O podría estar tomando mucho tiempo.

Por favor, dime por qué recibo un error y cómo solucionarlo.

¡Gracias!

Respuestas:


26

Su alias bash no está bien escrito (las comillas simples no se usan bien). En cambio, debería ser:

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

Ahora, personalmente no me gustan los usos inútiles de las tuberías y xargs, por lo tanto, su alias estaría mejor escrito como:

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

La -type fopción para encontrar solo archivos (no directorios, enlaces, etc.), la -vopción rmpara ser detallado (imprime lo que está eliminando). Al +final para que se findejecute rmcon todos los archivos encontrados (genera solo una instancia de rm, en lugar de una por archivo).

Ahora de man bash:

Para casi todos los propósitos, los alias son reemplazados por las funciones de shell.

En lugar de un alias, es mejor usar una función: comente su alias en el .bash_aliasesarchivo (es decir, ponga un #frente a esa línea), y en el archivo .bashrc, coloque esta función (en cualquier parte del archivo, al final está bien) :

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

Además, como menciona la otra respuesta, puede usar el -deletecomando para buscar. En este caso, su rm~función será:

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

De hecho, puede hacer una función genial que tomará un argumento, digamos --dry-run, que solo generará lo que eliminará:

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
}

Luego use como:

rm~ --dry-run

para mostrar solo los archivos que se eliminarán (pero no los eliminará) y luego

rm~

cuando eres feliz con esto

¡Adaptarse y extenderse a sus necesidades!

Nota. Tendrá que abrir una nueva terminal para que los cambios surtan efecto.


¡Gracias! Funciona bien, y el funcionamiento en seco es extremadamente útil.
Vinayak Garg

2
find -type f -name '*~' -delete(arma de elección, además git clean -dfx .)
sehe

2
Esta es una solución tan elegante que tuve que iniciar sesión solo para darle accesorios. +1 para ti, mi buen amigo!
CodeChimp

9

*~el shell lo expande antes de asignarlo a su alias. La asignación real es:

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

Sugiero usar funciones en lugar de alias, estos son mucho más potentes y más fáciles de manejar con respecto a las comillas.

Mientras estamos en eso, elimine lo superfluo .(el directorio actual está implícito si no se dan parámetros) y deje de abusar xargsya que -deleteya existe una opción.

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

La -lsopción es opcional, pero agregarla le mostrará qué archivos se han eliminado.


+1 ¡Gracias! Pero, ¿dónde agrego esta función?
Vinayak Garg

@VinayakGarg Puedes agregarlo a tu .bash_aliasestambién, pero generalmente los pongo directamente en mi .bashrc.
Lekensteyn
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.