Tengo este tipo de árbol de directorios que se obtiene al descomprimir un archivo zip:
x -> y -> z -> ejecutar -> ARCHIVOS Y DIRECTORIOS AQUÍ
Así que hay 4 directorios, 3 de los cuales están vacíos de archivos (x, y, z) y solo contienen 1 subdirectorio, y existe el directorio en el que estoy interesado, llamado " run ".
Quiero mover el directorio "ejecutar" (incluyendo todo lo que está dentro) a la ubicación "raíz" donde descomprimí (es decir, donde está "x", pero no dentro de "x").
Suposiciones: existe una carpeta llamada "ejecutar", pero no sé cuántos directorios tendré que "cd" para acceder (podría ser 3 (x, y, z), podría ser 10 o más. Los nombres También son desconocidos y no tienen que ser x, y, z, etc.
¿Cómo puedo lograr esto? Intenté muchas variaciones de esta pregunta pero todas fallaron.

Respuestas:
qué pasa
dónde
(en una nota al margen hay una
--junk-pathsopción en zip, ya sea al comprimir o descomprimir)fuente
Haría esto en
bash, usandoglobstar. Como se explica enman bash:Entonces, para mover el directorio
runal directorio de nivel superiorxy luego eliminar el resto, puede hacer lo siguiente:El
shoptcomando habilita laglobstaropción. Semv x/**/run/ x/moverán los subdirectorios nombradosrun(tenga en cuenta que esto solo funciona si solo hay unrundirectorio)xyfindse eliminarán los directorios vacíos.Si lo desea, puede hacer todo el proceso en el shell con globbing extendido, pero prefiero la red de seguridad
find -emptypara asegurarme de que no se eliminen los directorios no vacíos. Si no te importa eso, puedes usar:fuente
Definitivamente más detallado, pero hacer el trabajo en un solo paso:
Asumiendo que tienes Python instalado
Cómo utilizar
get_folder.pyEjecútelo con el directorio raíz (que contiene sus cosas descomprimidas) y el nombre de la carpeta para "levantar" como argumentos:
Y ya está hecho:
fuente
Solución Perl
La forma en que esto funciona es simple: la
find()subrutina atravesará el árbol de directorios dado de forma recursiva, encontrará el directorio cuyo nombre esruny lo insertará en una matriz de nombres de archivos deseados. En este caso, suponemos que solo debe haber un archivo en la lista, por lo tanto, una vez que se completa el comando, lo usamosdirmove()desde elFile::Copy::Recursivemódulo y lo movemos al directorio de trabajo actual desde el que se llamó el script. Así, en el caso de que le llamaremos a partir de directorio raíz parax.Árbol de directorios original:
Resultado:
fuente