
Tengo un grupo de carpetas que tienen archivos zip que pueden contener 1 o 2 archivos cada uno en una carpeta nueva. (ver diagrama a continuación)
Quiero apuntar el script al directorio de nivel superior y hacer que revise cada subdirectorio, extraiga el contenido del zip, mueva el contenido de ese subdirectorio hacia arriba un nivel (eliminar el archivo comprimido original es opcional).
--before--
Photos
-2018
--jan.zip
[--jan1 ]--\
[---jan1.pdf]---}-contents of Zipped file
[---jan1.JPG]--/
--feb.zip
[--feb1 ]--\
[---feb1.pdf]---}-contents of Zipped file
[---feb1.JPG]--/
...
--after--
Photos
-2018
--jan1.pdf
--jan1.JPG
--feb1.pdf
--feb1.JPG
Respuesta1
Antes de ejecutar cualquier cosa de lo siguiente, haga una copia (recursiva) de su directorio de nivel superior, solo para estar seguro.
Entonces puedes lograr lo que quieres así:
Haga que el directorio de nivel superior (fotos) sea su directorio de trabajo actual. Luego extraiga todos los archivos zip:
find . -iname "*.zip" -execdir unzip {} \;
Ahora mueva el contenido de los directorios extraídos un nivel hacia arriba:
find . -type f ! -iname "*.zip" -execdir mv "$(basename {})" .. \;
Esto no afectará los archivos zip ni los directorios extraídos, que quedan vacíos en este paso. Entonces puedes eliminarlos ahora:
find . -mindepth 2 -maxdepth 2 -type d -delete
Antes de eliminar los archivos zip, verifique que todo esté bien. Entonces puedes hacer la eliminación con
find . -iname "*.zip" -delete
En principio puedes combinar estos comandos en un script, pero te sugiero probarlos primero uno por uno comprobando el resultado después de cada paso.
Un script que toma su directorio de nivel superior como único argumento puede verse así:
#!/bin/bash
cd "$1"
find . -iname "*.zip" -execdir unzip {} \;
find . -type f ! -iname "*.zip" -execdir mv "$(basename {})" .. \;
find . -mindepth 2 -maxdepth 2 -type d -delete
find . -iname "*.zip" -delete
Si le da el nombre "extraer" (y establece el permiso de ejecución), puede usarse en su propio directorio como este (asumiendo ~/photos
que es su directorio de nivel superior):
./extract ~/photos
Pero cuidado: este script nunca fue probado. Tampoco realiza pruebas por sí solo. Depende exactamente del directorio y la estructura del archivo zip que describa. Así que haga copias y pruebas.