Te puede interesar "el hombre pobre find
":
shopt -s globstar
shopt -s
establece las opciones de shell con nombre. La globstar
opción se define como sigue 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 a /
, solo coinciden los directorios y subdirectorios.
Entonces, después de haberlo hecho shopt -s globstar
, cualquiera de los siguientes comandos:
ls -d1 - fuente / ** # El carácter después de la 'd' es el dígito uno.
ls -d - fuente / ** | cat # es decir, lo escribirá en una tubería a cualquier comando.
printf "% s \ n" fuente / **
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 directorio. 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 directorio. Es posible redirigir la salida de uno de la primera serie de comandos a un archivo, redirigir la salida de los anteriores a un segundo archivo, y luego usar comm
, diff
o algo similar, para restar el segundo archivo desde la primera, dejando sólo la llanura archivos (no directorios). Pero no hagas eso.
Otro enfoque (que no es mucho mejor) es
ls -d --file-type -- source/** | grep -v '/$'
La --file-type
opción le indica ls
que muestre un /
al final de cada nombre de directorio (y otros caracteres al final de otros tipos de archivos (especiales)), como este:
fuente // # Se agregó una
fuente / fuentes adicionales / # Se agregó una
fuente / fuentes / fontello
fuente / imágenes / # Agregado uno
fuente / imágenes / bg1.png
fuente / images / eng.png
fuente / images / fra.png
y luego grep -v '/$'
elimina las líneas que terminan con /
; es decir, los nombres de directorio. Desafortunadamente, POSIX--file-type
no especifica la opción . Si su versión de ls
no lo admite, úselo -F
. Es como, --file-type
excepto que también muestra un *
al final de los nombres de los archivos ejecutables, lo 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
para f en fuente / **
hacer
si [-f "$ f"]
luego
Inserte los comandos que se aplicarán a los archivos sin formato aquí.
fi
hecho
Notas:
- Cuando
ls
está dando salida a un terminal, y no es en -l
( l modo de ong), escribe varios nombres por línea (a menos que los nombres son muy largos). Puede forzarlo a escribir un nombre por línea especificando -1
(uno) o redirigiendo la salida a un archivo o una tubería.
- Probablemente no necesite realmente
--
los ls
comandos ya que está enumerando un directorio cuyo contenido creó. Debe usarlo cuando se enumera *
en un directorio desconocido, como protección contra los nombres de archivo que comienzan con -
.
- No intente analizar la salida de
ls
.
- La
globstar
opción de shell parece no estar definida por POSIX. (De hecho, no estoy seguro de que POSIX reconozca las opciones de shell). Si bien parece ser un bash
ismo, tenga cuidado, puede que no esté presente en todas las versiones de bash.
Si fonts
o images
tiene subdirectorios, **
mostrará una lista de todos ellos, de forma recursiva, hasta el fondo. Una forma (algo confusa y poco confiable) de limitar la profundidad es
ls -d --file-type -- source/** | grep -v '\(/.*\)\{3\}'
que elimina líneas que contienen tres o más /
caracteres.
find
mal; particularmente, si estás corriendofor file in $(find ...)
, has golpeado uno de ellos).