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.


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 .


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.


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

5

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

ls -la | grep -E '^[^d]' > files

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,^./,,

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.


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