Eu tenho esse tipo de árvore de diretório que é obtida ao descompactar um arquivo zip:
x -> y -> z -> run -> ARQUIVOS E DIRETÓRIOS AQUI
Portanto, existem 4 diretórios, 3 dos quais estão vazios de arquivos (x, y, z) e contêm apenas 1 subdiretório, e existe o diretório no qual estou interessado, chamado " run ".
Eu quero mover o diretório "run" (incluindo tudo dentro) para o local "raiz" onde descompactei (ou seja, onde "x" está, mas não dentro de "x").
Pressupostos: Não existe uma pasta chamada "run", mas eu não sei quantos diretórios terei de "cd" para chegar a ela (poderia ser de 3 (x, y, z), poderia ser 10 ou mais dos nomes. também são desconhecidos e não precisam ser x, y, z etc).
Como posso fazer isso? Tentei muitas variações dessa questão, mas todas falharam.
Respostas:
A respeito
Onde
(em uma nota lateral, há uma
--junk-paths
opção no zip, ao compactar ou descompactar)fonte
Eu faria isso
bash
usandoglobstar
. Como explicado emman bash
:Portanto, para mover o diretório
run
para o diretório de nível superiorx
e excluir o restante, você pode:O
shopt
comando ativa aglobstar
opção. Elemv x/**/run/ x/
moverá todos os subdiretórios nomeadosrun
(observe que isso só funciona se houver apenas umrun
diretório)x
efind
excluirá os diretórios vazios.Você pode fazer a coisa toda no shell com globbing estendido, se quiser, mas eu prefiro a rede de segurança
find -empty
para garantir que nenhum diretório não vazio seja excluído. Se você não se importa com isso, pode usar:fonte
Definitivamente mais detalhado, mas fazendo o trabalho em uma etapa:
Supondo que você tenha python instalado
Como usar
get_folder.py
Execute-o com o diretório raiz (contendo seus itens descompactados) e o nome da pasta para "levantar" como argumentos:
E está feito:
fonte
Solução Perl
A maneira como isso funciona é simples: a
find()
sub - rotina percorrerá a árvore de diretórios de forma recursiva, encontrará o diretório cujo nome érun
e o empurrará para uma variedade de nomes de arquivos desejados. Neste caso, assume-se que deve haver apenas um arquivo na lista, assim, uma vez conclusão do comando, usamosdirmove()
a partirFile::Copy::Recursive
do módulo, e movê-lo para o diretório de trabalho atual a partir do qual script foi chamado. Assim, no seu caso, você o chamaria do diretório pai parax
.Árvore de diretórios original:
Resultado:
fonte