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-paths
opció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
run
al directorio de nivel superiorx
y luego eliminar el resto, puede hacer lo siguiente:El
shopt
comando habilita laglobstar
opción. Semv x/**/run/ x/
moverán los subdirectorios nombradosrun
(tenga en cuenta que esto solo funciona si solo hay unrun
directorio)x
yfind
se 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 -empty
para 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.py
Ejecú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 esrun
y 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::Recursive
mó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