Eu faria isso em bash
, usando globstar
. Conforme explicado em man bash
:
globstar
If set, the pattern ** used in a pathname expansion con‐
text will match all files and zero or more directories
and subdirectories. If the pattern is followed by a /,
only directories and subdirectories match.
Portanto, para mover o diretório run
para o diretório de nível superior x
e, em seguida, exclua o restante, você pode fazer:
shopt -s globstar; mv x/**/run/ x/ && find x/ -type d -empty -delete
O comando shopt
ativa a opção globstar
. O mv x/**/run/ x/
moverá todos os subdiretórios denominados run
(observe que isso só funcionará se houver apenas um diretório run
) para x
e o find
excluirá todos os diretórios vazios.
Você poderia fazer a coisa toda no shell com globbing estendido, se preferir, mas eu prefiro a rede de segurança de find -empty
para ter certeza de que nenhum diretório não vazio seja deletado. Se você não se importa com isso, você pode usar:
shopt -s globstar; shopt -s extglob; mv x/**/run/ x/ && rm -rf x/!(run)