Eu tenho que manter todo o diretório que contém arquivos em um subdiretório específico, mas excluir todos os diretórios em que o subdiretório está vazio.
Para ser mais específico aqui é a estrutura:
A
|
|--------312311
| |
| |----Recording
| |----a.txt
| |----b.txt
|
|
|--------453453
| |----Recording
| |
| |-------a.mp3
| |----a.txt
| |----b.txt
|
|
|--------566532
| |----Recording
| |----a.txt
| |----b.txt
Os subdiretórios podem ou não conter um arquivo. Então, eu preciso excluir o diretório inteiro como '312311' e '566532' e apenas '453453' deve ser deixado com todos os dados, pois ele possui um arquivo na pasta 'Recording', que é um diretório específico para mim.
Eu vi muitos posts, mas ele tem links para muitos nomes de arquivos específicos. Qualquer ajuda será muito apreciada, como eu preciso fazer várias vezes em uma semana.
command-line
directory
find
Derek James
fonte
fonte
Respostas:
O script abaixo fará exatamente como você descreve:
Procura dentro de cada uma das pastas uma pasta chamada "Gravação"
Em uma imagem:
vai resultar em:
O script
Usar
delete_empty.py
Execute-o com o diretório (completo!) (Contenha seus subdiretórios, A no seu exemplo) como argumento pelo comando:
É isso aí.
Explicação
Alimentando o conteúdo da sua pasta "A" para o script,
listará seus subdiretórios (e arquivos). Então:
tentará listar o conteúdo de cada uma das (sub) pastas, o que gerará um erro se o item for um arquivo:
ou se a pasta "Gravação" não existir:
Se a pasta "Gravação" existir e estiver vazia, a pasta superior será removida:
EDITAR
Além disso, conforme solicitado nos comentários, uma versão que procurará vários subdiretórios (nomes).
Caso o diretório contenha qualquer um dos subdiretórios listados (não vazios), o diretório será mantido. Caso contrário, ele será excluído.
Usar
delete_empty.py
Execute-o com o diretório (completo!) (Contendo seus subdiretórios, A no seu exemplo) e os nomes dos subdiretórios como argumentos pelo comando:
É isso aí.
O script
Nota
Primeiro, execute um diretório de teste para garantir que ele faça exatamente o que você deseja.
fonte
Usando
find
exargs
:(remova a opção
echo
que estiver identificando os diretórios corretos). Aprintf '%h\0
peça imprime o diretório-pai (terminado em nulo) - deman find
:Ex .: dado
então
fonte
[\d]*
?Aqui está uma solução mais simples do bash:
Funciona porque
rmdir
falhará se o diretório não estiver vazio e&&
impedirá arm -r
execução, a menos que sejarmdir
bem-sucedido. A glob*/
garante que você esteja trabalhando apenas nos diretórios, para que outros arquivos não sejam afetados.fonte