No parece ser posible sin la alteración de la salida, pero aquí hay una forma alternativa fácil:
find source/ -type f
O (específico de la búsqueda de GNU), para obtener solo archivos en la profundidad de su pregunta:
find source/ -type f -mindepth 2 -maxdepth 2
(o si quieres directorios como ls
te da, quita -type f
)
Simplemente puede apegarse a ls si agrega algunos psicodélicos (ls -d
):
# mkdir test
# cd test
# mkdir A B C
# touch {A,B,C}/file*
# ls -d */*
A/file B/file C/file
Te puede interesar “El find
del pobre ”:
shopt -s globstar
shopt -s
s Establece la(s) opción(es) de shell nombrada(s). El globstar
la opción se define de la siguiente manera en bash(1):
Si se establece, el patrón **
utilizado en un contexto de expansión de nombre de archivo/ruta coincidirá con un archivo [sic] y cero o más directorios y subdirectorios. Si el patrón es seguido por un /
, solo coinciden los directorios y subdirectorios.
Entonces, después de haber hecho shopt -s globstar
, cualquiera de los siguientes comandos:
ls -d1 -- source/** # The character after the ‘d’ is the digit one. ls -d -- source/** | cat # i.e., it will write that into a pipe to any command. printf "%s\n" source/**
producirá la salida:
source/
source/fonts
source/fonts/fontello
source/images
source/images/bg1.png
source/images/eng.png
source/images/fra.png
Desafortunadamente, esto también incluye los nombres de los directorios. Podría ayudarte un poco saber que
printf "%s\n" source/**/
producirá la salida:
source/
source/fonts
source/images
es decir, solo los nombres de los directorios. Puede redirigir la salida de uno de los primeros conjuntos de comandos a un archivo, redirigir la salida del anterior a un segundo archivo y luego usar comm
, diff
, o algo similar, para restar el segundo archivo del primero, dejando solo los archivos sin formato (no directorios). Pero no hagas eso.
Otro enfoque (eso no es mucho mejor) es
ls -d --file-type -- source/** | grep -v '/$'
El --file-type
opción dice ls
para mostrar un /
al final de cada nombre de directorio (y otros caracteres al final de otros tipos de archivo (especiales), así:
source// # Added an extra one source/fonts/ # Added one source/fonts/fontello source/images/ # Added one source/images/bg1.png source/images/eng.png source/images/fra.png
y luego el grep -v '/$'
elimina las líneas que terminan en /
;es decir, los nombres de los directorios. Desafortunadamente, el --file-type
POSIX no especifica la opción. Si su versión de ls
no es compatible, use -F
. Eso es como --file-type
excepto que también muestra un *
al final de los nombres de los archivos ejecutables, que algunas personas encuentran molesto. Puedes eliminarlos con sed
:
ls -dF -- source/** | sed -e '/\/$/d' -e 's/\*$//'
Si desea hacer algo con todos los archivos (y solo los archivos), puede hacerlo
for f in source/** do if [ -f "$f" ] then Insert commands to be applied to plain files here. fi done
Notas:
- Cuando
ls
está enviando a una terminal, y no está en-l
(l ong), escribe múltiples nombres por línea (a menos que los nombres sean muy largos). Puede obligarlo a escribir un nombre por línea especificando-1
(uno), o redirigiendo la salida a un archivo o una canalización. - Probablemente no necesites el
--
en ells
comandos ya que está enumerando un directorio cuyos contenidos creó. Deberías usarlo cuando listes*
en un directorio desconocido, como protección contra los nombres de archivo que comienzan con-
. - No intente analizar la salida de
ls
. - El
globstar
La opción de shell parece no estar definida por POSIX. (De hecho, no estoy seguro de que POSIX reconozca cualquier opciones de shell). Si bien parece ser unbash
ism, tenga cuidado, es posible que no esté presente en todas las versiones de bash. -
Si
fonts
oimages
tiene subdirectorios,**
los enumerará a todos, recursivamente, hasta el final. Una forma (algo torpe y poco confiable) de limitar la profundidad esls -d --file-type -- source/** | grep -v '\(/.*\)\{3\}'
que elimina las líneas que contienen tres o más
/
personajes.