¿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 1opció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.
finden mac, no tiene -typeni -maxdepthopciones.
-typey -maxdepthno 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 fevitar el ./prefijo en los nombres de los archivos de salida; también tenga en cuenta el -maxdepthde 0, no 1), siempre que todo lo que necesite sean los nombres de los archivos en orden alfabético . Si desea lo lsque 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 fla 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 -Lpara 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.
lsademás de find, ya que el último devuelve rutas relativas y el primero solo nombres de archivo. Utilice la herramienta adecuada para el trabajo.
findanswer ( 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 lsel comportamiento depende de la presencia o ausencia de las opciones -ao -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
lsmuchas otras opciones de clasificación / formato de salida.La respuesta de Hans Roggeman ls+grep es pragmática, pero lo bloquea para usar el -lformato 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 ,farchivos, ddirectorios y lenlaces simbólicos antes de una lista de lsargumentos (ejecutar fls --helpo fls --manpara 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 npmfunciona 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 sudodepende de cómo haya instalado Node.js / io.js y de si ha cambiado los permisos más tarde ; si recibe un EACCESerror, vuelva a intentarlo con sudo.
El -gasegura global de la instalación y se necesita para poner flsen su sistema de $PATH.
bashscript como fls.chmod +x fls.$PATH, como /usr/local/bin(macOS) o /usr/bin(Linux).-1(el número uno); lsen 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 /bhace, si la memoria funciona), use la -1opció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 lsopciones, por ejemplo:
-lutilizar un formato de lista larga-tordenar por hora de modificación, las más recientes primero-rorden inverso al ordenar-F,--classifyañadir indicador (uno de * / => @ |) a las entradas-h,--human-readablecon -l y -s, tamaños de impresión como 1K 234M 2G, etc.
Alguna vez --colory 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/pathpor .para listar para el directorio actual o ..para el directorio principal .
También puede usar lscon grepo egrepy 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 xargspara que funcione, y se usa en -1lugar de -lmostrar solo nombres de archivo sin lsinformació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.
lsno lee la entrada estándar, por lo que es inútil canalizar nada a ls. ¿Se ha perdido xargs?
findcomando 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.
findpodrías hacerlo find . -maxdepth 1 -type f -ls. También parece que funciona en Mac OS, aunque creo -maxdepthy -lsno 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 echocorrectamente.