GNU/Linux >> Tutoriales Linux >  >> Linux

readlink -f y -e descripción de la opción no clara

El primer componente aquí significa un elemento de la ruta. Ejemplo:

/home/user/.ssh => <component1>/<component2>/<component3>

1- Supongamos que tenemos una estructura de directorios como esta:

lols
├── lol
├── lol1 -> lol
└── lol2 -> lol1

Y también el directorio inexistente aquí será lols/lol3Así que puedes comparar la salida de cada comando:

readlink -f lols/lol1 : /lols/lol
readlink -e lols/lol1 : /lols/lol

El resultado aquí será el mismo porque todos los componentes de la ruta existen.

readlink -f lols/lol8 : lols/lol8
readlink -e lols/lol8 : <empty outpyt>

El resultado aquí es diferente porque con -f mostrará el resultado porque hay un componente que existe al menos al menos en el camino que es lols y con -e la salida estará vacía porque todos los componentes de la ruta deben existir .

Y el último es tener múltiples directorios inexistentes:

readlink -f lols/lol8/lol10 : <empty output>
readlink -e lols/lol8/lol10 : <empty output>

Aquí la salida estará vacía porque, como se describe en la página del mapa:-f:todos menos el último componente deben existir => No respetado-o:todos los componentes deben existir => No respetado

2- ¿Por qué no usar solo ls -l :

Supongamos que creamos un archivo llamado archivo1 y creamos un enlace simbólico a este archivo llamado enlace1 y desde enlace1 creamos otro enlace simbólico enlace2:

touch file1 : file1 
ln -s file1 link1 : link1 -> file1
ln -s link1 link2 : link2 -> link1

Luego con ls -l link2 la salida será:link2 -> link1Y si usamos readlink link2 la salida será:link1; igual que ls -lPero si usamos readlink -f|-e link2 la salida será:archivo1; por lo que apuntará a la fuente archivo.

Entonces, ¿cuándo usar readlink? en lugar de ls ?Cuando hay un enlace simbólico anidado (Lectura recursiva). Cuando los archivos/directorios están en ubicaciones diferentes.

Así que mejor usar readlink en lugar de ls para evitar errores.


Esto es significativo para los enlaces que siguen una ruta con más de un salto hasta su destino final. Por ejemplo:

touch test_file

ln -s test_file test_link
ln -s non_existing_target dead_link

ln -s test_link link1
ln -s dead_link link2

En lo anterior, link1 finalmente está enlazando a un archivo, a través de test_link , entonces -f y -e daría el mismo resultado. link2 apunta a un enlace inactivo y ve que:

> readlink -e link2
> readlink -f link2
/home/thanasis/temp/non_existing_target

dead_link es el "último componente" en la expresión "deben existir todos menos el último componente". -f se está resolviendo en el objetivo que no existe, mientras que -e no da salida.

Tenga en cuenta que man readlink recomienda que

realpath es el comando preferido para usar para la funcionalidad de canonicalización

Para este ejemplo, realpath -m , (--missing ) daría el mismo resultado a readlink -f . En general realpath -e es la forma de probar si un enlace se puede resolver en un archivo de destino existente final, que devuelve el error esperado aquí:

> realpath -e link2
realpath: link2: No such file or directory

Mientras que ls -l devuelve todos los resultados y probablemente tenga una salida de color rojo para los enlaces muertos. También la opción -L existe, para desreferenciar los enlaces y mostrar su objetivo, esto es para que lo lean los humanos, nunca use ls para decidir cualquier cosa sobre un enlace dentro de un script.


Linux
  1. ¿Qué significa conectar Stdout y Stdin?

  2. ¿Iptables y proxies transparentes?

  3. ¿Por qué es Rm -rf y no Rmdir -rf?

  4. tmux:se cuelga y no carga, y no responde a ningún comando de opción

  5. ¿Por qué usamos su - y no solo su?

Linux:¿por qué usamos Su y no solo Su?

¿Por qué `clear` no borra toda la pantalla?

Cómo borrar el historial de Bash en Linux y Mac

Color diferente para comando y salida

rsync y enlaces simbólicos

cómo hacer que menos buscapersonas responda a la rueda de desplazamiento y no borre la pantalla