Cómo enumerar todos los enlaces simbólicos en un directorio


145

Tengo un enlace simbólico en mi /var/www/directorio que enlaza con WordPress. Cuando ejecuto el comando ls -ladesde el /var/www/directorio, el enlace a WordPress no aparece. ¿Hay alguna manera de enumerar todos los enlaces simbólicos que están en un directorio?


Respuestas:


80

Puede usar grepcon el lscomando para enumerar todos los enlaces simbólicos presentes en el directorio actual.

Esto enumerará todos los enlaces presentes en el directorio actual.

ls -la /var/www/ | grep "\->"

55
Devolverá falso positivo si tiene un archivo que contiene " ->". Pruebe un simpletouch "foo->"
Sylvain Pineau

77
no copie y pegue el contenido de otra respuesta a su propia respuesta. -1
αғsнιη

3
¿por qué no greping con ^l?
Eliran Malka

3
Como de costumbre, la mejor respuesta es la que tiene el + más alto
FractalSpace

¡Agradable! → .bash_alias: alias listlinks='ls -l --color | grep "\->"'8-)
Frank Nocke

285

El análisis lses una mala idea ® , prefiera una simple finden ese caso:

find . -type l -ls

Para procesar solo el directorio actual:

find . -maxdepth 1 -type l -ls

Créditos: ¿Cómo hago que el shell reconozca los nombres de archivo devueltos por un comando `ls -A`, y estos nombres contienen espacios?


find: Unknown argument to -type: 1
ahnbizcad

15
@ahnbizcad: No es 1(uno) sino l(enlace)
Sylvain Pineau

3
¡Gran respuesta! Ajusté el mío para no descender por la ruta del directorio de esta manera: ¡ find /<your_directory> -maxdepth 1 -type l -ls 2>/dev/null Gracias!
bgs

3
Solo para el directorio actual (es decir, no recursivo ) agregar -maxdepth 1.
Joshua Pinter

1
@ cig0 no necesitas usar awk, probablemente solo quieres esto:find . -maxdepth 1 -type l | sort -n
sobi3ch

10

el ls -lacomando muestra todos los archivos y carpetas y también el directorio simbólico vinculado, si este comando no muestra ningún directorio simbólico, significa que no tiene un enlace simbólico a WordPress .

ver el resultado de la ejecución ls -la:

kasiya@kasiya-pc:~$ cd /sys/devices/platform/sony-laptop
kasiya@kasiya-pc:/sys/devices/platform/sony-laptop$ ls -la
total 0
drwxr-xr-x  3 root root    0 Sep  9 19:57 .
drwxr-xr-x 14 root root    0 Sep 10  2014 ..
-r--r--r--  1 root root 4096 Sep  9 22:32 battery_care_health
-rw-r--r--  1 root root 4096 Sep  9 22:32 battery_care_limiter
lrwxrwxrwx  1 root root    0 Sep  9 19:57 driver -> ../../../bus/platform/drivers/sony-laptop
-r--r--r--  1 root root 4096 Sep  9 22:32 modalias
drwxr-xr-x  2 root root    0 Sep  9 22:32 power
lrwxrwxrwx  1 root root    0 Sep  9 22:32 subsystem -> ../../../bus/platform
-rw-r--r--  1 root root 4096 Sep  9 22:32 touchpad
-rw-r--r--  1 root root 4096 Sep  9 19:57 uevent

Verá que todo el directorio simbólico tiene lpermiso al inicio de las banderas de permisos. y si toma un grep ^lpuede enumerar solo archivos simbólicos o directorios:

kasiya@kasiya-pc:/sys/devices/platform/sony-laptop$ ls -la |grep ^l
lrwxrwxrwx 1 root root    0 Sep  9 19:57 driver -> ../../../bus/platform/drivers/sony-laptop
lrwxrwxrwx 1 root root    0 Sep  9 22:32 subsystem -> ../../../bus/platform
kasiya@kasiya-pc:/sys/devices/platform/sony-laptop$ 

El controlador y el directorio del subsistema son un enlace simbólico a otro directorio aquí.


1
Especificación menor aquí ... el primer carácter de la cadena de permisos no es realmente un permiso. Es el tipo de archivo. Como has dicho, lsignifica que es un enlace simbólico.
conner.xyz

5

grep es tu amigo:

ls -lhaF | grep ^l   # list links
ls -lhaF | grep ^d   # list directories
ls -lhaF | grep ^-   # list files

Esto mostrará una lista de líneas que comienzan con "l" que representan enlaces en la columna de permisos en lugar de luso dpara directorios y -archivos



1

Para ver los enlaces simbólicos en un directorio:

  1. Abra una terminal y muévase a ese directorio.

  2. Escribe el comando:

    ls -la
    

    Esto mostrará una lista larga de todos los archivos en el directorio incluso si están ocultos.

  3. Los archivos que comienzan lson sus archivos de enlace simbólico.


1
-1: la respuesta de KasiyA ya cubre esto.
muru

1

Esto devuelve todos los elementos vinculados simbólicamente (tanto dirs como fns) en un directorio:

find . -maxdepth 1 -type l -print | cut -c3- | grep -v "\#"

Sin embargo, para distinguir entre los tipos de elementos vinculados simbólicamente:

ls -lhaF | grep ^l | grep -v "\#" | cut -c42- | grep -v "/" | cut -d' ' -f1

Solo devuelve elementos de nombre de archivo vinculados simbólicamente. Y,

ls -lhaF | grep ^l | grep -v "\#" | cut -c42- | grep "/" | cut -d' ' -f1

Devuelve solo elementos de nombre de directorio vinculados simbólicamente.


0

Escriba ls -lai, enumerará todos los archivos y subdirectorios con los números de inodo correspondientes. Usted sabe que los archivos con el mismo número de inodo son los enlaces (hard o soft) y esta solución también funciona para los enlaces simbólicos.


ls -laino no mostrar el mismo número de inodo de un archivo y sus enlaces simbólicos. A diferencia de los enlaces duros, los enlaces simbólicos tienen sus propias entradas de inodo separadas. Esto es lo que parece.
Eliah Kagan

0

También se puede hacer con python:

$ python -c "import os,sys; print '\n'.join([os.path.join(sys.argv[1],i) for i in os.listdir(sys.argv[1]) if os.path.islink(os.path.join(sys.argv[1],i))])" /path/to/dir

Ejecución de muestra:

$ python -c "import os,sys; print '\n'.join([os.path.join(sys.argv[1],i) for i in os.listdir(sys.argv[1]) if os.path.islink(os.path.join(sys.argv[1],i))])" /etc
/etc/vtrgb
/etc/printcap
/etc/resolv.conf
/etc/os-release
/etc/mtab
/etc/localtime

Esto se puede extender para que sea recursivo a través de la os.walkfunción, pero es suficiente usar una generación de lista simple para enumerar enlaces en un solo directorio como lo mostré anteriormente.

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.