¿Cómo puedo enumerar todos los archivos de una carpeta pero no sus carpetas o subarchivos? En otras palabras: ¿Cómo puedo enumerar solo los archivos?
¿Cómo puedo enumerar todos los archivos de una carpeta pero no sus carpetas o subarchivos? En otras palabras: ¿Cómo puedo enumerar solo los archivos?
Respuestas:
Usando find
:
find . -maxdepth 1 -type f
El uso de la -maxdepth 1
opción garantiza que solo busque en el directorio actual (o, si reemplaza el .
con alguna ruta, ese directorio). Si desea una lista recursiva completa de todos los archivos en ese y subdirectorios, simplemente elimine esa opción.
find
en mac, no tiene -type
ni -maxdepth
opciones.
-type
y -maxdepth
no son opciones en el sentido normal; BSD find
(como se usa en OS X) los llama primarios , y deben ir después del operando (s) del nombre de archivo ( .
, en este caso, tenga en cuenta que, a diferencia de Linux, la versión BSD necesita al menos un operando de nombre de archivo explícito); el comando en esta respuesta definitivamente funciona en una Mac.
find *.png -maxdepth 0 -type f
evitar el ./
prefijo en los nombres de los archivos de salida; también tenga en cuenta el -maxdepth
de 0
, no 1
), siempre que todo lo que necesite sean los nombres de los archivos en orden alfabético . Si desea lo ls
que de otra manera puede hacer por usted (formato / orden de salida diferente, control en línea sobre si los elementos ocultos están incluidos o no), complementado con filtrado de [múltiples] tipos, el script de mi respuesta puede ayudar.
find * -maxdepth 0 -type f
(una alternativa derivada del comentario de @ AlexHall) con find . -maxdepth 1 -type f
la respuesta: find . ...
invariablemente incluye elementos ocultos, invariablemente antepone los nombres de archivo de salida ./
y, con GNU find
(Linux), generalmente genera una lista sin clasificar. find * ...
, debido a que permite que el shell realice un globbing por adelantado, excluye de forma predeterminada los elementos ocultos (se puede cambiar con shopt -s dotglob
), genera meros nombres de archivo (sin prefijo), ordenados alfabéticamente. Ninguno de los enfoques incluye enlaces simbólicos a archivos; use la opción -L
para hacerlo.
ls -p | grep -v /
ls -p le permite mostrar / después del nombre de la carpeta, que actúa como una etiqueta que puede eliminar.
ls
además de find
, ya que el último devuelve rutas relativas y el primero solo nombres de archivo. Utilice la herramienta adecuada para el trabajo.
find
answer ( find . -maxdepth 1 -type f
) basado en carlpett funciona en principio, pero nols
./
ls
es exactamente lo mismo que usar : obtienes una lista potencialmente desordenada de nombres de archivos con el prefijo y pierdes la capacidad de aplicar las muchas opciones ;
también find
invariablemente también encuentra elementos ocultos , mientras que ls
el comportamiento depende de la presencia o ausencia de las opciones -a
o -A
.
Una mejora , sugerida por Alex Hall en un comentario sobre la pregunta, es combinar el globbing de caparazones confind
:
find * -maxdepth 0 -type f # find -L * ... includes symlinks to files
ls
muchas otras opciones de clasificación / formato de salida.La respuesta de Hans Roggeman ls
+grep
es pragmática, pero lo bloquea para usar el -l
formato de salida largo ( ) .
Para hacer frente a estas limitaciones que escribió el fls
( f iltering ls ) de utilidad ,
ls
al mismo tiempo que proporciona capacidad de filtrado de tipos ,f
archivos, d
directorios y l
enlaces simbólicos antes de una lista de ls
argumentos (ejecutar fls --help
o fls --man
para obtener más información).Ejemplos:
fls f # list all files in current dir.
fls d -tA ~ # list dirs. in home dir., including hidden ones, most recent first
fls f^l /usr/local/bin/c* # List matches that are files, but not (^) symlinks (l)
Plataformas compatibles
Nota: Incluso si no usa Node.js, su administrador de paquetes npm
funciona en todas las plataformas y es fácil de instalar; tratar
curl -L https://git.io/n-install | bash
Con Node.js instalado, instale de la siguiente manera:
[sudo] npm install fls -g
Nota :
Si lo necesita sudo
depende de cómo haya instalado Node.js / io.js y de si ha cambiado los permisos más tarde ; si recibe un EACCES
error, vuelva a intentarlo con sudo
.
El -g
asegura global de la instalación y se necesita para poner fls
en su sistema de $PATH
.
bash
script como fls
.chmod +x fls
.$PATH
, como /usr/local/bin
(macOS) o /usr/bin
(Linux).-1
(el número uno); ls
en realidad, el valor predeterminado es la salida "desnuda", es decir, sólo nombres de archivo, pero cuando se envía a un terminal utiliza un diseño basado en columnas (varios nombres de archivo por línea). Para obtener un nombre de archivo por línea de salida (que es lo que dir /b
hace, si la memoria funciona), use la -1
opción, que en realidad está implícitamente activa cuando stdout no está conectado a una terminal, como cuando se envía a un archivo de salida o tubería.
Me gusta usar ls
opciones, por ejemplo:
-l
utilizar un formato de lista larga-t
ordenar por hora de modificación, las más recientes primero-r
orden inverso al ordenar-F
,--classify
añadir indicador (uno de * / => @ |) a las entradas-h
,--human-readable
con -l y -s, tamaños de impresión como 1K 234M 2G, etc.
Alguna vez --color
y todas las demás. (Ver ls --help
)
Esto mostrará archivos, enlaces simbólicos, dispositivos, tuberías, sockets, etc.
entonces
find /some/path -maxdepth 1 ! -type d
se podría ordenar por fecha fácilmente:
find /some/path -maxdepth 1 ! -type d -exec ls -hltrF {} +
o
find /some/path -maxdepth 1 -type f
ordenados por tamaño:
find /some/path -maxdepth 1 -type f -exec ls -lSF --color {} +
Para no mostrar entradas ocultas, donde el nombre comienza con un punto, puede agregar ! -name '.*'
:
find /some/path -maxdepth 1 ! -type d ! -name '.*' -exec ls -hltrF {} +
Entonces
Puede reemplazar /some/path
por .
para listar para el directorio actual o ..
para el directorio principal .
También puede usar ls
con grep
o egrep
y ponerlo en su perfil como un alias:
ls -l | egrep -v '^d'
ls -l | grep -v '^d'
buscar archivos: ls -l / home | grep "^ -" | tr -s '' | cortar -d '' -f 9
buscar directorios: ls -l / home | grep "^ d" | tr -s '' | cortar -d '' -f 9
buscar enlaces: ls -l / home | grep "^ l" | tr -s '' | cortar -d '' -f 9
tr -s '' convierte la salida en un archivo delimitado por espacios, el comando de corte dice que el delimitador es un espacio y devuelve el noveno campo (siempre el nombre de archivo / nombre de directorio / nombre de enlace).
¡Uso esto todo el tiempo!
{ find . -maxdepth 1 -type f | xargs ls -1t | less; }
agregado xargs
para que funcione, y se usa en -1
lugar de -l
mostrar solo nombres de archivo sin ls
información adicional
find -printf0 '...' | sort -z
Solo agrego a la respuesta de carlpett. Para una vista más útil de los archivos, puede canalizar la salida a ls.
find . -maxdepth 1 -type f|ls -lt|less
Muestra los archivos modificados más recientemente en un formato de lista, bastante útil cuando ha descargado muchos archivos y desea ver una versión ordenada de los más recientes.
ls
no lee la entrada estándar, por lo que es inútil canalizar nada a ls
. ¿Se ha perdido xargs
?
find
comando en esta respuesta se ignora por completo ; el comando general es el mismo que ls -lt | less
, que no realiza ningún filtrado de tipo.
find
podrías hacerlo find . -maxdepth 1 -type f -ls
. También parece que funciona en Mac OS, aunque creo -maxdepth
y -ls
no están debidamente opciones portátiles.
"find '-maxdepth'" no funciona con mi versión anterior de bash, por lo tanto, uso:
para f en $ (ls); hacer si [-f $ f]; luego echo $ f; fi; hecho
for f in $(ls)
es doblemente incorrecto. Podrías arreglar eso con for f in *
pero luego se rompería porque no estás citando el argumento echo
correctamente.