Estoy escribiendo un script de shell que toma rutas de archivos como entrada.
Por esta razón, necesito generar listados de archivos recursivos con rutas completas. Por ejemplo, el archivo bartiene la ruta:
/home/ken/foo/bar
pero, por lo que puedo ver, ambos lsy findsolo dan listados de rutas relativas:
./foo/bar   (from the folder ken)
Parece un requisito obvio, pero no puedo ver nada en las páginas findo lsman.
¿Cómo puedo generar una lista de archivos en el shell incluyendo sus rutas absolutas?
                    
                        linux
                                command-line
                                absolute-path
                                ls
                                
                    
                    
                        Conocido
fuente
                
                fuente

find /home/ken/foo/bar -exec ls -ld $PWD/{} \;Respuestas:
Si da
finduna ruta absoluta para comenzar, imprimirá rutas absolutas. Por ejemplo, para buscar todos los archivos .htaccess en el directorio actual:o si su shell se expande
$PWDal directorio actual:findsimplemente antepone la ruta que se le dio a una ruta relativa al archivo desde esa ruta.Greg Hewgill también sugirió usar
pwd -Psi desea resolver enlaces simbólicos en su directorio actual.fuente
pwd -P.ls -d -1 $PWD/**/*pero creo quefind $PWDtambién funciona (probado en bash)find $PWDes simple. Ellsencantamiento es complejo y difícil de manejar (a menos que lo alias).findno depende de las expansiones de glob de shell, por lo que funcionará en cualquier shell.findtambién es mucho más flexible, puedo obtener una lista recursiva de todos los archivos, o tal vez de todos los directorios, o tal vez quiero una lista de todos los archivos xml, o todos los archivos cambiados en la última semana. Todo eso es posible confind, pero no fácilmente conls.find "`pwd`" -name .htaccessdebido a los espacios en los nombres de directorioda el camino absoluto completo. pero si el archivo es un enlace simbólico, obtendrás el nombre final resuelto.
fuente
realpathen su lugarbrew install coreutils, a continuación, el ejecutable se instalará como/usr/local/opt/coreutils/libexec/gnubin/readlinkUse esto para directorios ( se necesita el
/after**en bash para limitarlo a directorios):esto para archivos y directorios directamente debajo del directorio actual, cuyos nombres contienen
.:esto para todo:
Tomado de aquí http://www.zsh.org/mla/users/2002/msg00033.html
En bash,
**es recursivo si lo habilitasshopt -s globstar.fuente
Puedes usar
en bash
fuente
Esto solo se ve en el directorio actual . Cita "$ PWD" en caso de que contenga espacios.
fuente
Mando:
ls -1 -d "$PWD/"*Esto le dará las rutas absolutas del archivo como a continuación.
fuente
La
$PWDes una buena opción de Matthew arriba. Si desea que solo se impriman archivos, también puede agregar la opción -type f para buscar solo archivos normales. Otras opciones son "d" solo para directorios, etc. Entonces, en su caso, sería (si quiero buscar solo archivos con .c ext):o si quieres todos los archivos:
Nota: No puede crear un alias para el comando anterior, porque $ PWD se completa automáticamente en su directorio de inicio cuando bash establece el alias.
fuente
Si le da al comando find una ruta absoluta, escupirá los resultados con una ruta absoluta. Entonces, desde el directorio de Ken si tuviera que escribir:
(en lugar de la ruta relativa
find . -name bar -print)Deberías obtener:
Por lo tanto, si desea un
ls -ly hacer que devuelva la ruta absoluta, puede decirle al comando find que ejecute unls -len lo que encuentre.NOTA: hay un espacio entre
{}y;Obtendrás algo como esto:
Si no está seguro de dónde está el archivo, siempre puede cambiar la ubicación de búsqueda. Siempre que la ruta de búsqueda comience con "/", obtendrá una ruta absoluta a cambio. Si está buscando una ubicación (como /) donde obtendrá muchos errores de permiso denegado, entonces recomendaría redirigir el error estándar para que pueda ver los resultados de la búsqueda:
(
2>es la sintaxis para los shells Borne y Bash, pero no funcionará con el shell C. Puede funcionar también en otros shells, pero solo sé con certeza que funciona en Bourne y Bash).fuente
lsproceso con-exec ls -ld {} +. (Probablemente no desee-dtenerlscontenidos de directorio de lista). O mejor, use find integradolsconfind ... name bar -ls. Además, tiene la sintaxis incorrecta para un argumento por comando: debe citar el punto y coma del shell, así que es{} \;.fdUsando
fd(alternativa afind), use la siguiente sintaxis:¿Dónde
.está el patrón de búsqueda yfooes el directorio raíz?Por ejemplo, a la lista de todos los archivos de
etcforma recursiva, ejecute:fd . /etc -a.fuente
Solo una alternativa a
para señalar que
*es la expansión de shell, asíharía lo mismo (el inconveniente que no puede usar
-1para separar por nuevas líneas, no espacios).fuente
-1para separar por líneas?fuente
Aquí hay un ejemplo que imprime una lista sin un período adicional y que también muestra cómo buscar una coincidencia de archivo. Espero que esto ayude:
fuente
Esto funcionó para mí. Pero no figuraba en orden alfabético.
Este comando enumera alfabéticamente y también enumera los archivos ocultos.
fuente
statRuta absoluta de un solo archivo:
fuente
Es posible que desee probar esto.
Puede obtener la ruta del ABS usando el
forbucle yechosimplemente sin élfind.fuente
Si necesita una lista de todos los archivos en los subdirectorios actuales
Si necesita una lista de todos los archivos solo en el directorio actual
fuente
Esto le dará la ruta canónica (resolverá los enlaces simbólicos):
realpath FILENAMESi desea la ruta canónica al enlace simbólico mismo, entonces:
realpath -s FILENAMEfuente
La mayoría de los métodos sugeridos, si no todos, dan como resultado rutas que no se pueden usar directamente en algún otro comando de terminal si la ruta contiene espacios. Idealmente, los resultados tendrán barras inclinadas antepuestas. Esto funciona para mí en macOS:
fuente
find / -printhará estofuente
fuente