2011-04-23 23 views
137

Estoy tratando de verificar si existe un enlace simbólico en bash. Esto es lo que he intentado.Cómo comprobar si existe un enlace simbólico

mda=/usr/mda 
if [ ! -L $mda ]; then 
    echo "=> File doesn't exist" 
fi 


mda='/usr/mda' 
if [ ! -L $mda ]; then 
    echo "=> File doesn't exist" 
fi 

Sin embargo, eso no funciona. If '!' queda fuera, nunca se dispara. Y si '!' está ahí, se dispara todo el tiempo.

+1

por lo que vale, si usa [[! -D $ mda]] funciona bien .. – DMin

Respuesta

219

-L devuelve true si el "archivo" existe y es un enlace simbólico (el archivo vinculado puede existir o no). Desea -f (devuelve verdadero si el archivo existe y es un archivo normal) o tal vez solo -e (devuelve verdadero si el archivo existe independientemente del tipo).

De acuerdo con la GNU manpage, -h es idéntica a -L, pero de acuerdo con la BSD manpage, no debe usarse:

-h file Cierto si fichero existe y es un enlace simbólico. Este operador se conserva para compatibilidad con versiones anteriores de este programa. No confíes en su existencia; use -L en su lugar.

+2

Estoy buscando para ver si un enlace simbólico NO existe. ! -h o! -L debería funcionar para enlaces simbólicos,! -e debería funcionar de otra manera. – bear

+30

Para ayudar a cualquiera que encuentre esto a través de Google como lo hice, la sintaxis completa usando '!' Es 'si! [-L $ mda]; then .... fi', es decir, coloca el signo de exclamación _outside_ entre corchetes. – Sam

+13

Solo quería agregar algo a la sugerencia dada por @Sam; Al realizar este tipo de operaciones, asegúrese de poner el nombre de su archivo entre comillas, para evitar problemas con los espacios en blanco. p. 'si [! -L "$ mda"]; then ... fi' (nota: 'if [! ...]' y 'if! [...]' son idénticos :) –

1

Si está probando la existencia de archivos, quiere -e no -L. -L prueba un enlace simbólico.

+0

Estoy buscando para ver si un enlace simbólico NO existe. ! -h o! -L debería funcionar para enlaces simbólicos,! -e debería funcionar de otra manera. – bear

+3

Lo que quiere no está claro. El archivo existe y no es un enlace simbólico? Luego prueba * both * -e y! -h. –

+0

El bit del archivo fue un error, es un enlace simbólico, no un archivo per se. – bear

3

¿El archivo es realmente un enlace simbólico? De lo contrario, la prueba habitual para la existencia es -r o -e.

Ver man test.

13

Quizás esto es lo que estás buscando. Para verificar si existe un archivo y no es un enlace.

probar este comando:

file="/usr/mda" 
[ -f $file ] && [ ! -L $file ] && echo "$file exists and is not a symlink" 
31

-L es la prueba para el archivo existe y es también un enlace simbólico

Si no desea probar para el archivo de ser un enlace simbólico, pero solo prueba para ver si existe independientemente del tipo (archivo, directorio, socket, etc.) luego usa -e

Entonces, si el archivo es realmente un archivo y no solo un enlace simbólico, puedes hacer todas estas pruebas y obtener un estado de salida cuyo valor indica la condición de error.

if [ ! \(-e "${file}" \) ] 
then 
    echo "%ERROR: file ${file} does not exist!" >&2 
    exit 1 
elif [ ! \(-f "${file}" \) ] 
then 
    echo "%ERROR: ${file} is not a file!" >&2 
    exit 2 
elif [ ! \(-r "${file}" \) ] 
then 
    echo "%ERROR: file ${file} is not readable!" >&2 
    exit 3 
elif [ ! \(-s "${file}" \) ] 
then 
    echo "%ERROR: file ${file} is empty!" >&2 
    exit 4 
fi 
+9

'-e" $ {archivo} "' falla si el enlace simbólico existe pero su destino no existe. – Flimm

+0

Mismo resultado que Flimm. Estoy en OS X. Para mí, -L y -h funcionan para enlaces simbólicos, pero no -e o -f. – pauljm

+0

@Flimm, así que si solo quiero probar si se toma un nombre de archivo (ya sea un archivo o enlace simbólico sin objetivo existente), ¿cuál es la mejor manera de hacerlo? aparentemente -e no funciona – dragonxlwang

12

se puede comprobar la existencia de un enlace simbólico y que no se rompe con:

[ -L ${my_link} ] && [ -e ${my_link} ] 

Por lo tanto, la solución completa es:

if [ -L ${my_link} ] ; then 
    if [ -e ${my_link} ] ; then 
     echo "Good link" 
    else 
     echo "Broken link" 
    fi 
elif [ -e ${my_link} ] ; then 
    echo "Not a link" 
else 
    echo "Missing" 
fi 
3

Cómo sobre el uso readlink?

# if symlink, readlink returns not empty string (the symlink target) 
# if string is not empty, test exits w/ 0 (normal) 
# 
# if non symlink, readlink returns empty string 
# if string is empty, test exits w/ 1 (error) 
simlink?() { 
    test "$(readlink "${1}")"; 
} 

FILE=/usr/mda 

if simlink? "${FILE}"; then 
    echo $FILE is a symlink 
else 
    echo $FILE is not a symlink 
fi 
Cuestiones relacionadas