bash - soporta - ¿Cómo encuentro todos los enlaces simbólicos en un árbol de directorios?
no se permiten enlaces fuertes para directorios (5)
Un comando, sin tuberías
find . -type l -ls
Simple y simple ...
Ampliando esta respuesta, aquí hay un par más de comandos de find
relacionados con el enlace simbólico:
Encuentra enlaces simbólicos a un objetivo específico
find . -lname link_target
Tenga en cuenta que link_target
puede contener caracteres comodín.
Encuentra enlaces simbólicos rotos
find -L . -type l -ls
La opción -L
indica que find
seguir enlaces simbólicos, a menos que se rompa.
Buscar y reemplazar enlaces simbólicos rotos
find -L . -type l -delete -exec ln -s new_target {} /;
Más encontrar ejemplos
Se pueden find
más ejemplos de find
aquí: http://hamwaves.com/find/
Estoy tratando de encontrar todos los enlaces simbólicos dentro de un árbol de directorios para mi sitio web. Sé que puedo usar find
para hacer esto, pero no puedo averiguar cómo consultar los directorios de forma recursiva.
He intentado este comando:
find /var/www/ -type l
... y más tarde descubrí que los contenidos en /var/www
son enlaces simbólicos, así que cambié el comando a:
find -L /var/www/ -type l
lleva un tiempo correr, sin embargo, no obtengo ninguna coincidencia.
¿Cómo hago esto para verificar los subdirectorios?
Esto es lo mejor que he encontrado hasta ahora: le muestra los enlaces simbólicos en el directorio actual, recursivamente, pero sin seguirlos, se muestran con rutas completas y otra información:
find ./ -type l -print0 | xargs -0 ls -plah
salidas se ve así:
lrwxrwxrwx 1 apache develop 99 Dec 5 12:49 ./dir/dir2/symlink1 -> /dir3/symlinkTarget
lrwxrwxrwx 1 apache develop 81 Jan 10 14:02 ./dir1/dir2/dir4/symlink2 -> /dir5/whatever/symlink2Target
etc...
Esto recorrerá de forma recursiva el directorio /path/to/folder
y enumerará solo los enlaces simbólicos:
ls -lR /path/to/folder | grep ^l
Si su intención es seguir los enlaces simbólicos también, debe usar su comando find
pero debe incluir la opción -L
; de hecho, la página find
man dice:
-L Follow symbolic links. When find examines or prints information
about files, the information used shall be taken from the prop‐
erties of the file to which the link points, not from the link
itself (unless it is a broken symbolic link or find is unable to
examine the file to which the link points). Use of this option
implies -noleaf. If you later use the -P option, -noleaf will
still be in effect. If -L is in effect and find discovers a
symbolic link to a subdirectory during its search, the subdirec‐
tory pointed to by the symbolic link will be searched.
When the -L option is in effect, the -type predicate will always
match against the type of the file that a symbolic link points
to rather than the link itself (unless the symbolic link is bro‐
ken). Using -L causes the -lname and -ilname predicates always
to return false.
Entonces prueba esto:
find -L /var/www/ -type l
Probablemente esto funcione: encontré en la página find
man este diamante: si está usando la opción -type
, tiene que cambiarla a la opción -xtype
:
l symbolic link; this is never true if the -L option or the
-follow option is in effect, unless the symbolic link is
broken. If you want to search for symbolic links when -L
is in effect, use -xtype.
Entonces:
find -L /var/www/ -xtype l
Para ver solo los enlaces simbólicos, puede usar
find -L /path/to/dir/ -xtype l
mientras que si quieres ver también a qué archivos se dirigen, solo agrega un ls
find -L /path/to/dir/ -xtype l -exec ls -al {} /;
find
ya ve de manera recursiva por defecto:
[15:21:53 ~]$ mkdir foo
[15:22:28 ~]$ cd foo
[15:22:31 ~/foo]$ mkdir bar
[15:22:35 ~/foo]$ cd bar
[15:22:36 ~/foo/bar]$ ln -s ../foo abc
[15:22:40 ~/foo/bar]$ cd ..
[15:22:47 ~/foo]$ ln -s foo abc
[15:22:52 ~/foo]$ find ./ -type l
.//abc
.//bar/abc
[15:22:57 ~/foo]$