¿Cómo excluyo directorios cuando enumero archivos?

21

¿Cómo excluyo directorios cuando enumero archivos en el directorio actual?

ls .

^ incluirá directorios en la lista.

Stephen Watkins
fuente

Respuestas:

23

Prueba este:

find . -maxdepth 1 -not -type d
Alexander Gladysh
fuente
3
que sea simple: $ find. -tipo f
atascado el
99
No. (1) sería recursivo, (2) no incluiría enlaces simbólicos. @Steve pidió el equivalente de ls .sin directorios, y aquí está.
Alexander Gladysh
2
Agregar -lso -exec ls -l {} \;lo haría ls -lsin directorios.
Ladadadada
15

Para obtenerlo exactamente equivalente a ls .usted, no debe mostrar directorios ocultos.

find . -maxdepth 1 -not -type d -and -not -name '.*'

y eso todavía te deja con el prefijo './' para cada nombre de archivo. Eso no es realmente un problema, pero creo que es un poco feo. Yo fui con:

ls -p | grep -v '/$'

Y eso le dará una lista que se ve igual, y también puede agregar lsargumentos adicionales . Agregue un --color=alwaysy obtendrá sus colores de dir, o -apara ver archivos ocultos.

Me gusta la respuesta de Alexander porque en realidad depende de un sistema de archivos característico del archivo en cuestión para que nunca se deje engañar. Mi respuesta será engañada por un archivo que tiene un '/' como último carácter en su nombre. Pero eso parece que está pidiendo problemas.

Sean O'Leary
fuente
1
'-no' está relacionado con GNU find, ya que no es compatible con POSIX, es mejor no enseñar estas opciones ya que un usuario podría tener hábitos "malos" y sentirse perdido en otros UNIX :)
jirib
2
@JiriXichtkniha, ¿cuál es la alternativa POSIX a -not?
Lucas Gallindo
5

prueba esto:

$ encontrar. -tipo f -maxdepth 1

o esto:

$ ls -p | egrep -v / $

$ ls -la | egrep -v ^ d

atascado
fuente
3

Aunque es una publicación antigua, pensé que esto podría ayudar ...

$ ls -l | grep -v ^ d

Enumerará todos los archivos, incluidos enlaces simbólicos, caracteres y archivos de bloque.

sandeep.s85
fuente
Esta respuesta ya fue proporcionada hace más de un año por jamzed, (haciendo este ruido visual.)
Alexx Roche
2

Las soluciones "encontrar" anteriores pierden algunas de las capacidades de ls , por ejemplo: enumerar solo archivos, ordenados en tiempo de modificación descendente.

Las respuestas "ls -p | grep" no tratan con elegancia otros elementos de ls como -R si se desean

La siguiente respuesta, mientras que más detallado, en mi opinión refleja la verdadera ls comportamiento y mayor flexibilidad para seleccionar "sólo los archivos"

ls -t . | while read line; do
  if [ -f $line ]; then
    echo $line
  fi 
done

Simplemente reemplace los interruptores ls como desee y el resultado se devolverá solo con archivos. Si también se requieren enlaces y otros elementos, entonces será necesario realizar una revisión menor para la prueba para su inclusión.

Pancho
fuente
0
ls $(file --no-pad  -F' '  * | grep -v directory | cut -d' ' -f1)

Con esto, aún puede usar cualquier otra opción que lsgeneralmente tome. O ... eliminar -vpara enumerar solo directorios. O ... reemplace el directorio con cualquier otro tipo de archivo que filecomprenda e informe, como ASCII, vacío, ELF, etc.

Kaulbach
fuente
Esto no funciona si alguno de los nombres de archivo que se enumerarán contienen espacios.
Psiconauta el
ls -t .|while read f;do [ -f "$f" ]&& echo $f;donees aproximadamente 3 veces más rápido en mis pruebas
Alexx Roche
0

Estaba en un sistema donde el findbinario no era compatible -noty terminé usando:

ls|while read f;do [ -f "$f" ]&& echo $f;done

Ventajas: no se basa en otra cosa que no sea sh ls echo
compatible con bash y dash
Se puede cambiar para que coincida con otras cosas (como directorios) al cambiar -f
Es más rápido que algunas de las respuestas y usa menos RAM y CPU

Alexx Roche
fuente