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 -al
para 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 -e
modo.[ ! -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 -e
modo 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 unarm
falla te mateset -e
, lo que probablemente sea indeseable.! ||
es bastante conciso y claro, y no sufre ninguno de estos problemas.rm
dentro de su prueba, b) usar una declaración if real, c) no andar usando-e
shells interactivos internos (¡y probar sus scripts!). Si quieres discutir sobre la legibilidad, usarif
para probar si algo es un enlace es claramente el ganador.Puede utilizar
find
y su-type l
condició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
foo
en 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
-delete
opción enfind
es 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
find
yrm -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 quemadorm
en el pasado. Doble va para una-delete
bandera fuera de lugar .http://slackermedia.ml/trashy
fuente
find . -type l -iname "foo" | xargs rm -i
es más seguro.rm -i
Por seguridad, seguro.-print0
parafind
y-0
paraxargs
.@
es un calificador global ; el patrónfoo(@)
coincide con lo quefoo
coincide, 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