Idealmente me gustaría un comando como este
rm --only-if-symlink link-to-file
porque me he quemado demasiadas veces borrando accidentalmente el archivo en lugar del enlace simbólico que apunta al archivo. Esto puede ser especialmente malo cuando sudo está involucrado. Ahora, por supuesto, hago una ls -alpara asegurarme de que realmente sea un enlace simbólico y tal, pero eso es vulnerable a errores de operador (nombre similar de archivo, error tipográfico, etc.) y condiciones de carrera (si alguien quisiera que elimine un archivo por alguna razón). ¿Hay alguna manera de verificar si un archivo es un enlace simbólico y solo eliminarlo si está en un comando?
bash
command-line
rm
Shelvacu
fuente
fuente

Respuestas:
fuente
!y cambiar||a&&||forma.&&derriba las cosas si estás enset -emodo.[ ! -L $1 ]), utilizando un operador no válido ([ ! -l foo ]), o incluso error de sintaxis ([ ! -q foo || echo foo)rm_if_link(){ [ -L "$1" ] && rm -v "$1"; }es que ejecutarlo en unset -emodo sin enlace matará su proceso de shell. Podrías agregar|| :pero luego, en mi humilde opinión, se vuelve aún menos claro que la! ||versión, y evitará que unarmfalla te mateset -e, lo que probablemente sea indeseable.! ||es bastante conciso y claro, y no sufre ninguno de estos problemas.rmdentro de su prueba, b) usar una declaración if real, c) no andar usando-eshells interactivos internos (¡y probar sus scripts!). Si quieres discutir sobre la legibilidad, usarifpara probar si algo es un enlace es claramente el ganador.Puede utilizar
findy su-type lcondición de prueba (que pone a prueba para ver si el objeto encontrado es un l tinta o no)Por ejemplo, si tiene un archivo llamado
fooen el directorio actual, puede hacer esto:Es posible que pueda simplificar eso con solo:
Lo cual eliminaría todos los enlaces simbólicos en el directorio actual.
Advertencia:
La
-deleteopción enfindes realmente muy peligrosa. ASEGÚRESE DE COLOCARLO AL FINAL DEL MANDO DE ENCUENTRO. Si lo extravía, eliminará todo lo que encuentre, independientemente de si los resultados coinciden con su condicional.Como se sugiere en los comentarios, una opción más segura podría ser usar
findyrm -i(lo que le obliga a confirmar la eliminación del archivo) en conjunción:Personalmente, uso
-exec trash {} \;para eliminar archivos temporalmente, porque yo, como tú, me he quemadormen el pasado. Doble va para una-deletebandera fuera de lugar .http://slackermedia.ml/trashy
fuente
find . -type l -iname "foo" | xargs rm -ies más seguro.rm -iPor seguridad, seguro.-print0parafindy-0paraxargs.@es un calificador global ; el patrónfoo(@)coincide con lo quefoocoincide, pero solo los enlaces simbólicos.foo(-@)solo coincidiría con enlaces simbólicos rotos.foo(@,L0)solo coincidiría con enlaces simbólicos y archivos vacíos.Por supuesto, si está ejecutando zsh en primer lugar, solo necesita escribir
rm foo(@). Debe tener cuidado de no presionar Enterantes de escribir(@).fuente