Eu tenho um grande diretório n-level estruturado da seguinte forma:
root
|
subdir1
|
sub_subdir1
|
....(n-2 levels).....
|
file1
|
subdir2
|
sub_subdir2
|
....(n-2 levels).....
|
file2
Eu quero nivelar o diretório para que todos os subdiretórios de nível 1 contenham arquivos . Eu também quero remover o nível 2 para (n-1) sub_subdirs , pois eles não contêm arquivos. Observe que todos os subdiretórios têm nomes diferentes.
Resultado desejado
root
|
subdir1
|
file1
|
subdir2
|
file2
Eu encontrei muitos posts explicando métodos para achatar diretórios, mas nenhum que explica como fazer isso de maneira controlada, ou seja,
- especificando os níveis a serem nivelados
- ou fazendo isso recursivamente para todos os sub_diretórios em um diretório raiz
Usando zsh:
Este:
subdir*
(novamente do seu exemplo: combinando subdir1 e subdir1)**
recurso de globbing recursivo do zsh, limitado pelo qualificador glob*(.)
que diz: qualquer entrada neste diretório que seja um arquivo simples*(/)
que diz para corresponder as entradas que são diretórios.No bash, faça o seguinte:
Isso analisa tudo em “
root
”, incluindo arquivos de ponto. Se você não precisa olhar para arquivos de ponto, deixe de fora oshopt -s dotglob
. Atenção: não adicione.*
ou ao comando.root/.*
for
O
/
no final do glob ( ), como sugerido por Jeff, nos obtém apenas os subdiretórios, então não precisamos testar cada um (por exemplo, com ).root/*/
if
Para cada subdiretório de
root
, encontre todos os arquivos dentro e sob esse subdiretório e mova-os para o subdiretório. Use-i
para evitar a substituição de arquivos (por exemplo, se você tiver vários arquivos chamadosfile1
distribuídos emsubdir1
).-i
significa "interativo" e perguntará se deve substituir um arquivo existente. Esteja ciente de que ele pode se recusar a fazê-lo, mesmo se você disser “sim”. Se sua versão demv
não suportar a-t
opção, substitua a linha pelomv
comando porEm seguida, exclua todos os subdiretórios no subdiretório de nível superior. Observe que isso (
find
…-delete
) falhará se algum arquivo não for movido.Isso é parcialmente inspirado pela resposta de derobert para Flattening a nested directory .