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 bar
tiene la ruta:
/home/ken/foo/bar
pero, por lo que puedo ver, ambos ls
y find
solo dan listados de rutas relativas:
./foo/bar (from the folder ken)
Parece un requisito obvio, pero no puedo ver nada en las páginas find
o ls
man.
¿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
find
una 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
$PWD
al directorio actual:find
simplemente antepone la ruta que se le dio a una ruta relativa al archivo desde esa ruta.Greg Hewgill también sugirió usar
pwd -P
si desea resolver enlaces simbólicos en su directorio actual.fuente
pwd -P
.ls -d -1 $PWD/**/*
pero creo quefind $PWD
también funciona (probado en bash)find $PWD
es simple. Ells
encantamiento es complejo y difícil de manejar (a menos que lo alias).find
no depende de las expansiones de glob de shell, por lo que funcionará en cualquier shell.find
tambié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 .htaccess
debido 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
realpath
en su lugarbrew install coreutils
, a continuación, el ejecutable se instalará como/usr/local/opt/coreutils/libexec/gnubin/readlink
Use 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
$PWD
es 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 -l
y hacer que devuelva la ruta absoluta, puede decirle al comando find que ejecute unls -l
en 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
ls
proceso con-exec ls -ld {} +
. (Probablemente no desee-d
tenerls
contenidos de directorio de lista). O mejor, use find integradols
confind ... 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{} \;
.fd
Usando
fd
(alternativa afind
), use la siguiente sintaxis:¿Dónde
.
está el patrón de búsqueda yfoo
es el directorio raíz?Por ejemplo, a la lista de todos los archivos de
etc
forma 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
-1
para separar por nuevas líneas, no espacios).fuente
-1
para 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
stat
Ruta absoluta de un solo archivo:
fuente
Es posible que desee probar esto.
Puede obtener la ruta del ABS usando el
for
bucle yecho
simplemente 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 FILENAME
Si desea la ruta canónica al enlace simbólico mismo, entonces:
realpath -s FILENAME
fuente
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 / -print
hará estofuente
fuente