¿Cómo trabajo recursivamente a través de un árbol de directorios y ejecuto un comando específico en cada archivo, y envío la ruta, el nombre de archivo, la extensión, el tamaño de archivo y algún otro texto específico a un solo archivo en bash.
14
Respuestas:
Si bien las
find
soluciones son simples y potentes, decidí crear una solución más complicada, basada en esta interesante función , que vi hace unos días.1. Cree un archivo de script ejecutable, llamado
walk
, que esté ubicado/usr/local/bin
para ser accesible como comando de shell:nano
: Shift+ Insertpara pegar; Ctrl+ Oy Enterpara guardar; Ctrl+ Xpara salir.2. El contenido del guión
walk
es:3. Explicación:
El mecanismo principal de la
walk()
función está bastante bien descrito por Zanna en su respuesta . Así que describiré solo la parte nueva.Dentro de la
walk()
función he agregado este bucle:Eso significa que para cada
$entry
archivo que se ejecute se ejecutará la funciónfile_specification()
.La función
file_specification()
tiene dos partes. La primera parte obtiene datos relacionados con el archivo: nombre, ruta, tamaño, etc. La segunda parte genera los datos en forma bien formateada. Para formatear los datos se utiliza el comandoprintf
. Y si desea modificar el script, debe leer sobre este comando, por ejemplo, este artículo .La función
file_specification()
es un buen lugar donde puede colocar el comando específico que debe ejecutarse para cada archivo . Use este formato:O puede guardar la salida del comando como variable, y luego
printf
esta variable, etc.O directamente
printf
la salida del comando:La sección de inicio, llamada
Colourise the output
, inicializa algunas variables que se usan dentro delprintf
comando para colorear la salida. Puede encontrar más sobre esto aquí .En la parte inferior del script se agrega una condición adicional que trata con rutas absolutas y relativas.
4. Ejemplos de uso:
Para ejecutar
walk
el directorio actual:Para ejecutar
walk
cualquier directorio secundario:Para ejecutar
walk
cualquier otro directorio:Para crear un archivo de texto, basado en la
walk
salida:Para crear un archivo de salida sin códigos de color ( fuente ):
5. Demostración de uso:
fuente
Estoy un poco perplejo en cuanto a por qué nadie lo ha publicado todavía, pero
bash
sí tiene capacidades recursivas, si habilita laglobstar
opción y usa**
glob. Como tal, puedes escribir (casi) unbash
script puro que use ese globstar recursivo como este:Tenga en cuenta que aquí usamos la expansión de parámetros para obtener las partes del nombre de archivo que queremos y no confiamos en comandos externos, excepto para obtener el tamaño del archivo
du
y limpiar la salida conawk
.Y a medida que atraviesa su árbol de directorios, su salida debería ser algo como esto:
Se aplican las reglas estándar de uso de script: asegúrese de que sea ejecutable
chmod +x ./myscript.sh
y ejecútelo desde el directorio actual./myscript.sh
o colóquelo~/bin
y ejecútelosource ~/.profile
.fuente
"$(file "$i")"
(en la secuencia de comandos anterior como segunda parte de un printf) regresaría?output the path, filename, extension, filesize
, por lo que la respuesta coincide con lo que se pregunta. :)Puedes usar
find
para hacer el trabajoEsto lo ayudará si solo desea enumerar todos los archivos con tamaño.
-exec
le permitirá ejecutar comandos personalizados o secuencias de comandos para cada archivo\;
utilizado para analizar archivos uno por uno, puede usar+;
si desea concatenarlos (significa nombres de archivo).fuente
Con
find
solo.O bien, puede usar a continuación en su lugar:
fuente
find -printf
). +1Si sabe cuán profundo es el árbol, la forma más fácil será usar el comodín
*
.Escribe todo lo que quieras hacer como un script de shell o una función
a continuación, ejecutar
for i in *; do thing "$i"; done
,for i in */*; do thing "$i"; done
, ... etc.Dentro de su función / script, puede usar algunas pruebas simples para seleccionar los archivos con los que desea trabajar y hacer lo que necesite con ellos.
fuente
$i
.for i in */*
funciona. Aquí,for i in */*; do printf "|%s|\n" "$i"; done
find
puede hacer esto:Echa un vistazo a
man find
otras propiedades de archivo.Si realmente necesita la extensión, puede agregar esto:
fuente