¿Cómo puedo hacer una búsqueda dinámica de archivos zip en una ruta particular (por ejemplo, /opt/uploading/"*"/multiple .zip
archivos) y descomprimirlos en la misma carpeta que los archivos zip?
La siguiente función es descomprimir varios archivos zip y eliminar archivos zip. Pero quiero que los archivos zip estén ahí con los archivos descomprimidos.
while true; do
find -iname '*.zip' > zipindex
test -s zipindex || break
for zip in $(cat zipindex); do unzip -o $zip && rm $zip; done
done
Respuesta1
Bueno, rm $zip
está eliminando los archivos .Zip, así que elimínelo.
Respuesta2
Esto es mucho más adecuado para un bucle for que para un bucle while. De esta manera también puede deshacerse del almacenamiento innecesario de resultados defind -iname '*.zip' > zipindex
Haz algo como esto en su lugar:
#!/bin/bash
for zip in $(find -iname '*.zip'); do
unzip -o $zip
done
Esto recorrerá todas las líneas que produce la búsqueda.
Por supuesto, deberías prescindir por completo del script bash y hacer una línea de búsqueda como esta:
find -iname '*.zip' -execdir unzip {} \;
EDITAR: Gracias a @don_crissti y @ilkkachu, logré deshacerme de llamar a otra instancia del Shell en -exec. -execdir ¡es bueno saberlo!
Respuesta3
Usando GNU Parallel puedes hacer esto:
find my_dir | grep -E '\.zip$' | parallel unzip
inotifywait -qmre MOVED_TO -e CLOSE_WRITE --format %w%f my_dir | grep -E '\.zip$' | parallel -u unzip
De esta manera, no tendrá que esperar a que aparezca el siguiente archivo zip.