enumerar archivos en un directorio sin enumerar subdirectorios y sus contenidos en ese directorio

24

Quiero crear una lista de todos los archivos en un directorio, sin enumerar ninguno de los subdirectorios que residen en ese mismo directorio, e imprimir esa lista en un nuevo archivo.

ls -d * > filelist

creará una lista de todos los archivos en el directorio actual, pero también enumera los subdirectorios en el directorio actual. Probé el findcomando usando la -maxdepth 1opción; sin embargo, el formato de salida es un problema, ya que find también imprime la ruta junto con los nombres de los archivos.

Si alguien puede decirme quizás otro comando u opciones para usar que produzca una lista de salida de solo los archivos en un directorio y no los nombres de los subdirectorios o sus contenidos, lo agradecería.

janet
fuente
2
Estoy confundido, ls -d *solo enumere los archivos y carpetas en la carpeta actual, excluyendo los archivos / carpetas ocultos aquí;
GM-Script-Writer-62850
sí, pero no quiero que se enumeren las carpetas en ese directorio, solo quiero que se enumeren los archivos en ese directorio
janet

Respuestas:

22

Solución basada en el hallazgo:

find . -maxdepth 1 -type f -printf '%f\n'

Solución basada en bash:

for f in *; do [[ -d "$f" ]] || echo "$f"; done
##  or, if you want coloured output:
for f in *; do [[ -d "$f" ]] || ls -- "$f"; done

La solución basada en bash te dará todo lo que no sea un directorio; incluirá cosas como tuberías con nombre (probablemente quieras esto). Si desea específicamente solo archivos , use el findcomando o uno de estos:

for f in *; do [[ -f "$f" ]] && echo "$f"; done
##  or, if you want coloured output:
for f in *; do [[ -f "$f" ]] && ls -- "$f"; done

Si va a usar esto regularmente, por supuesto, puede poner esto en un alias en algún lugar de su ~/.bashrc:

alias lsfiles='for f in *; do [[ -f "$f" ]] && ls -- "$f"; done'

Como notó en los comentarios que en realidad está en OSX en lugar de Ubuntu, sugeriría que la próxima vez dirija sus preguntas a Apple o más sitios generales de intercambio de pila de Unix y Linux .

maldad
fuente
1
Asegúrese de verificar que estas soluciones sean correctas para usted en función de si desea o no incluir archivos ocultos.
Kevin Wheeler
10

Listar solo nombres de archivos:

1. ls -p | grep -v / (sin archivos ocultos)
 2. ls -l | grep ^ - | tr -s '' | cut -d '' -f 9 (sin archivos ocultos)

 a) ls -pa | grep -v / (con archivos ocultos)
 b) ls -la | grep ^ - | tr -s '' | cut -d '' -f (con archivos ocultos)

Listar solo directorios:

1. ls -p | grep / (sin oculto)
 2. ls -l | grep ^ d | tr -s '' | cut -d '' -f 9 (sin oculto)

 a) ls -pa | grep / (con oculto)
 b) ls -l | grep ^ d | tr -s '' | cut -d '' -f 9 (con oculto)

grep -v -e ^ $ es eliminar líneas en blanco del resultado.

Más detalles :
ls -p flag es poner '/' al final del nombre del directorio, -R flag es para búsqueda recursiva, -l para listar con información, -a para listar todo (incluyendo archivos ocultos) con información, grep El indicador -v es para inversión de resultados y el indicador -e para coincidencia de expresiones regulares.

Ananda
fuente
7

Para enumerar solo archivos normales:

ls -al | grep ^-

Con enlaces simbólicos incluidos:

ls -al | grep ^[-l]

Donde el primer carácter de la lista describe el tipo de archivo, -significa que es un archivo normal, ya que el enlace simbólico es l.

Debian / Ubuntu

Imprima los nombres de todos los archivos coincidentes (incluidos los enlaces):

run-parts --list --regex . .

Con caminos absolutos:

run-parts --list --regex . $PWD

Imprima los nombres de todos los archivos /etcque comienzan con py terminan con d:

run-parts --list --regex '^p.*d$' /etc
kenorb
fuente
5

Otra solución más, ingenuamente corta, que funcionó para mí:

ls -la | grep -E '^[^d]' > files
arsaKasra
fuente
perfecto para mí,ls -alR |grep -E '^-'
aquí
4

Sugeriría usar find y simplemente eliminar el nombre del directorio de la salida si es necesario:

find . -type f -maxdepth 1 | sed s,^./,,
Puma
fuente
2
-maxdepth 1debe aparecer antes de cualquier filtro, y puede lograr este resultado sin usar sedcon la -printfopción, es decir: find . -maxdepth 1 -type f -printf '%f\n'(esto será más eficiente que usar un programa adicional).
evilsoup
3
ls -1 --file-type | grep -v '/' | sed s/@$// > filelist

Otra opción posible es

ls -F | grep -v '/' | sed /[@*]$// > filelist

El --file-typepone un / al final de las carpetas (pero también una @ al final de los enlaces simbólicos. The grep -v '/'Elimina los subdirectorios (porque ahora terminan con un '/'). El sed s/@$//elimina ese @. El -1 imprime un archivo por línea para que grep -v funcione correctamente.

Dr.Tower
fuente
Gracias por su respuesta. desafortunadamente, no funciona para mí, tal vez lo estoy ejecutando incorrectamente. si uso el comando exacto que me diste, aparece el siguiente error: ls: opción ilegal - - uso: ls [-ABCFGHLPRSTWabcdefghiklmnopqrstuwx1] [archivo ...] intenté usar el carácter comodín * en lugar de en lugar de junto con --file-type. si pudieras aclarar, te lo agradecería!
janet
El comando funciona para mí (ejecutando 13.04), ¿qué versión de ubuntu estás usando ?; -1no importa a grep no lo necesitas; si desea incluir archivos ocultos, use la -aopción enls
GM-Script-Writer-62850
En realidad, estoy trabajando en una Mac. ¿Quizás el comando es ligeramente diferente en Mac OS X o Unix?
janet
1
También podría intentarlols -F | grep -v '/' | sed s/[@*]$// > filelist
Dr.Tower