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.

dreftymac
fuente
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 }'
ghostdog74
fuente
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
stefanB
fuente
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 .)

otros
fuente
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"
Ivan Alegre
fuente
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
Kerkael
fuente
¡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"
Padrino
fuente
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 *.

Justin Johnson
fuente
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

Ideal
fuente
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

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

encontrar / hará el truco

Dmitry
fuente
10

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

ls -lR /path/I/need
KellyC
fuente
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 ...

6112115
fuente
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

Con la libertad de usar todas las opciones posibles de ls:

find -type f | xargs ls -1

Grzegorz Luczywo
fuente
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
Dimitrios
fuente
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 \{\} \;
Denio Mariz
fuente
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.

Kevin
fuente
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.

koeselitz
fuente
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 ...

Steve
fuente
4

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

sivi
fuente
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
John Keyes
fuente
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 "/$"          
Regla B
fuente
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]
Chaitanya
fuente
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

hpj
fuente