Comando ls: ¿cómo puedo obtener una lista de ruta completa recursiva, una línea por archivo?


493

¿Cómo puedo hacer que ls escupe una lista plana de rutas recursivas de uno por línea?

Por ejemplo, solo quiero una lista plana de archivos con sus rutas completas:

/home/dreftymac/.
/home/dreftymac/foo.txt
/home/dreftymac/bar.txt
/home/dreftymac/stackoverflow
/home/dreftymac/stackoverflow/alpha.txt
/home/dreftymac/stackoverflow/bravo.txt
/home/dreftymac/stackoverflow/charlie.txt

ls -a1 casi hace lo que necesito, pero no quiero fragmentos de ruta, quiero rutas completas.


Ver también: árbol
dreftymac

Respuestas:


386

Si realmente quieres usar ls, formatea su salida usando awk:

ls -R /path | awk '
/:$/&&f{s=$0;f=0}
/:$/&&!f{sub(/:$/,"");s=$0;f=1;next}
NF&&f{ print s"/"$0 }'

55
@dreftymac, lo que significa que esta es, objetivamente hablando, la respuesta correcta a la pregunta que escribió, intencionalmente o no. Sí, posiblemente no fue la respuesta correcta a la pregunta que esperaba haber escrito. Y aunque estoy de acuerdo con su punto más importante: "cuando el sabio señala la luna, el tonto mira el dedo", es justo que minimicemos el impacto de la subjetividad para evaluar la corrección, especialmente cuando el criterio no tiene ninguna posible ambigüedad.
Lurscher

1
@dreftymac, estaré encantado de cambiar mi voto, pero ahora está bloqueado, debe editar la pregunta para poder actualizar el voto
lurscher

77
¿Alguien puede explicar las awkexpresiones anteriores ?
Mert Nuhoglu

2
Esta solución no omite los directorios (cada directorio tiene su propia línea)
JayB

2
Gracias. Por cierto, sería bueno tener esto en 1 línea para copiar y pegar rápidamente.
Leo Ufimtsev

567

Use find:

find .
find /home/dreftymac

Si solo desea archivos (omita directorios, dispositivos, etc.):

find . -type f
find /home/dreftymac -type f

2
¿Pueden lsparámetros como --sort=extension"redimidos" por esta solución?
n611x007

Incluso puede usar la salida printf para mostrar la información contextual necesaria (por ejemplo, encontrar. -Type f -printf '% p% u \ n')
xsubira

¿Se puede formatear con un falg? es decir. python pprint.pprint (archivos)
Nathan

72

ls -ld $(find .)

si desea ordenar su salida por tiempo de modificación:

ls -ltd $(find .)


11
-bash: / bin / ls: Lista de argumentos demasiado larga
jperelli

1
+1 funcionó para mí con 12106 archivos, y podría usar el --sort=extensionparámetro dels
n611x007

3
Gracias. No habría pensado por mí mismo en esa sintaxis (agradable y corta): habría usado find . -name "*" -exec ls -ld '{}' \;(esa funciona independientemente de la cantidad de archivos), pero su comando es mucho más corto de escribir;)
SRG

1
ls -ld $ (find.) se interrumpe para mí si estoy enumerando un disco ntfs donde los archivos tienen espacios: ls: no se puede acceder ./Sistema: No existe tal archivo o directorio, sin embargo, encontrar con citas de @SRG funciona
kuz8

Sería una alternativa más corta (dependiendo de sus necesidades) find . -ls.
IanS

59

Pruebe la siguiente manera más simple:

find "$PWD"

99
find "`pwd`"si la ruta contiene espacios u otros caracteres especiales.
mustafa.0x

77
¿Cómo es esto diferente de find .? -.-
Salman von Abbas

77
@SalmanPK Si encuentra una ruta absoluta pwdpara comenzar, imprimirá rutas absolutas. Por cierto, "¿Cómo es esto diferente a find" ;-)
yckart

44

El mejor comando es: tree -fi

Para usar los archivos pero no los enlaces, debe eliminarlos >de su salida:

tree -fi |grep -v \>

Si desea conocer la naturaleza de cada archivo (para leer solo archivos ASCII, por ejemplo) con dos whiles:

tree -fi | \
grep -v \> | \
while read first ; do 
    file ${first}
done | \
while read second; do 
    echo ${second} | grep ASCII
done

¡Gracias, no lo sabía tree!
Dan Filimon

@Nakilon, ¿qué es lo más cercano? ¿Muestra la salida de manera similar? ¿Cómo mostrarías fácilmente una salida similar con un comando corto ?
om01

66
@ om01: en osx es difícil brew install tree, dado que está utilizando homebrew
ccpizza

No pude enumerar los archivos exclusividad. siempre enumera los directorios también. ¿Cómo puedo hacer eso?
kommradHomer

¡Esto debería ser calificado mucho más alto!
der_grund

44

Oh, realmente una larga lista de respuestas. Ayudó mucho y finalmente, creé el mío que estaba buscando:

Para enumerar todos los archivos en un directorio y sus subdirectorios:

find "$PWD" -type f

Para enumerar todos los directorios en un directorio y sus subdirectorios:

find "$PWD" -type d

Para enumerar todos los directorios y archivos en un directorio y sus subdirectorios:

find "$PWD"

2
Y para filtrar por extensión:find "$PWD" -type f | grep '\.json$'
Killroy

2
No es necesario realizar un procesamiento posterior con grep, use -name en find like: find "$ PWD" -type f -name * .json y si desea eliminar los archivos enumerados: encuentre "$ PWD" -type f -name * .json -exec rm {} \; de manera similar, si desea copiarlo, reemplace rm con cp y destino: -exec cp {} destination
Padrino

18

No sé sobre el camino completo, pero puedes usarlo -Rpara la recursividad. Alternativamente, si no estás empeñado ls, puedes hacerlo find *.


16

Sin usar comandos externos que no sean ls:

ls -R1 /path | 
  while read l; do case $l in *:) d=${l%:};; "") d=;; *) echo "$d/$l";; esac; done


Opción desconocida '-1'. Abortar
ilw

15
du -a

Práctico para algunas carcasas de electrodomésticos limitados donde buscar / ubicar no están disponibles


1
¿Alguna idea de cómo puedo eliminar el tamaño de archivo sin él awk?
Arnold Roa


10

No lo hagas complicado. Acabo de usar esto y obtuve una salida hermosa:

ls -lR /path/I/need

3
OP quiere solo el camino completo y nada más. ls -lRNo cumpliría ese objetivo.
codeforester

lo siento, no lo hace
Aryeh Beitz

9

La forma más fácil para todas las personas futuras es simplemente:

du

Sin embargo, esto también muestra el tamaño de lo que contiene cada carpeta. Puede usar awk para generar solo el nombre de la carpeta:

du | awk '{print $2}'

Editar- Lo siento, lo siento, mi mal. Pensé que solo se necesitaban carpetas. Dejaré esto aquí en caso de que alguien en el futuro lo necesite de todos modos ...


Interesante, porque me muestra cosas que no sabía que quería saber, algo así como lo sugiere Google. Resulta que me gusta saber cuánto espacio ocupa cada archivo.
Jake Toronto


9

Creo que para una lista plana la mejor manera es:

find -D tree /fullpath/to-dir/ 

(o para guardarlo en un archivo txt)

find -D tree /fullpath/to-dir/ > file.txt

3
Probado en Mac OS 10.13.3. find: illegal option -- D
Jayant Bhawal

8

Ejecute un comando bash con el siguiente formato:

find /path -type f -exec ls -l \{\} \;

6

Aquí hay una respuesta parcial que muestra los nombres de directorio.

ls -mR * | sed -n 's/://p'

Explicación:

ls -mR * enumera los nombres de directorio completos que terminan en ':', luego enumera los archivos en ese directorio por separado

sed -n 's/://p' encuentra líneas que terminan en dos puntos, quita los dos puntos e imprime la línea

Al iterar sobre la lista de directorios, también deberíamos poder encontrar los directorios. Todavía estoy trabajando en eso. Es un desafío obtener los comodines a través de xargs.


gran respuesta ... exactamente lo que necesitaba!
Selvin

5

Agregar un comodín al final de un directorio ls fuerza las rutas completas. En este momento tienes esto:

$ ls /home/dreftymac/
foo.txt
bar.txt
stackoverflow
stackoverflow/alpha.txt
stackoverflow/bravo.txt
stackoverflow/charlie.txt

Podrías hacer esto en su lugar:

$ ls /home/dreftymac/*
/home/dreftymac/.
/home/dreftymac/foo.txt
/home/dreftymac/bar.txt
/home/dreftymac/stackoverflow:
alpha.txt
bravo.txt
charlie.txt

Desafortunadamente, esto no imprime la ruta completa para los directorios que se repiten, por lo que puede no ser la solución completa que está buscando.


También desafortunadamente no puede sudo ls con un comodín (porque el comodín se expande como el usuario normal).
Andrew Lorien

4

Muchas respuestas veo. Esto es mío, y creo que es bastante útil si estás trabajando en Mac.

Estoy seguro de que sabe que hay algunos archivos de "paquete" ( .app , .rtfd , .workflow , etc.). Y mirando la ventana del Finder parecen archivos individuales. Pero no lo son. Y $ lso $ findverlos como directorios ... Entonces, a menos que necesite enumerar también su contenido, esto funciona para mí:

find . -not -name ".*" -not -name "." | egrep -v "\.rtfd/|\.app/|\.lpdf/|\.workflow/"

Por supuesto, esto es para el directorio de trabajo, y puede agregar extensiones de otros paquetes (pero siempre con un /después de ellos). O cualquier otra extensión si no es paquete sin el/ .

Más bien interesante el " .lpdf/" (pdf multilingüe). Tiene una .pdfextensión " " normal (!!) o ninguna en Finder. De esta manera obtienes (o solo cuenta 1 archivo) para esto pdfy no un montón de cosas ...


4

ls -lR es lo que estabas buscando, o al menos yo era. salud


OP quiere solo el camino completo y nada más. ls -lRNo cumpliría ese objetivo.
Hadrien TOMA

3

Si el directorio se pasa como una ruta relativa y deberá convertirlo en una ruta absoluta antes de llamar a find. En el siguiente ejemplo, el directorio se pasa como primer parámetro al script:

#!/bin/bash

# get absolute path
directory=`cd $1; pwd`
# print out list of files and directories
find $directory

Si su sistema lo tiene readlink, puede hacerlodirectory=$(readlink -e $1)
Pausado hasta nuevo aviso.

Es cierto, pero la combinación cd / pwd funcionará en todos los sistemas. readlinken OS X 10.5.8 no es compatible con la opción -e.
John Keyes el

3
tar cf - $PWD|tar tvf -             

Esto es lento pero funciona de forma recursiva e imprime directorios y archivos. Puede canalizarlo con awk / grep si solo desea los nombres de archivo sin el resto de información / directorios:

tar cf - $PWD|tar tvf -|awk '{print $6}'|grep -v "/$"          

2
también puede usar simplemente: tar cvf / dev / null $ PWD
RuleB

2

@ ghostdog74: pequeño retoque con tu solución.
El siguiente código se puede utilizar para buscar archivos con su ruta absoluta completa.

sudo ls -R / | awk '<br/>
/:$/&&f{s=$0;f=0}<br/>
/:$/&&!f{sub(/:$/,"");s=$0;f=1;next}<br/>
NF&&f{ print s"/"$0 }' | grep [file_to_search]

1

Conocía el nombre del archivo, pero también quería el directorio.

encontrar $ PWD | nombre de archivo fgrep

funcionó perfectamente en Mac OS 10.12.1

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.