Preciso encontrar diretórios vazios para uma determinada lista de diretórios. Alguns diretórios possuem diretórios dentro dele.
Se os diretórios internos também estiverem vazios, posso dizer que o diretório principal está vazio, caso contrário, não está vazio.
Como posso testar isso?
Por exemplo:
A>A1(file1),A2 this is not empty beacuse of file1
B>B1(no file) this is empty
C>C1,C2 this is empty
Respostas:
Verifique se
find <dir> -type f
produz alguma coisa. Aqui está um exemplo:fonte
-type f
serve.mkdir A B C A/A1 A/A2 B/B1 C/C1 C/C2; touch A/A1/file1
- e executar o código em minha resposta, ele informa que B e C estão vazios, conforme exigido pelo OP. Portanto, você precisará ser um pouco mais específico do que "não vai funcionar".Depende um pouco do que você deseja fazer com os diretórios vazios. Eu uso o comando abaixo quando desejo excluir todos os diretórios vazios dentro de uma árvore, digamos
test
diretório.Uma coisa a notar sobre o comando acima é que ele também removerá arquivos vazios , então use a opção -type d para evitar isso.
Solte
-delete
para ver os arquivos e diretórios correspondentes.Se a sua definição de árvore de diretório vazia é que ela não contém arquivos, então você será capaz de juntar algo baseado em se
find test -type f
retorna algo.find
é um ótimo utilitário, e RTFM cedo e frequentemente para realmente entender o quanto ele pode fazer :-)fonte
-empty
, tão conveniente!find test -name ".DS_Store" -delete
primeiro e, em seguida, o-empty delete
comando. Observe também, como parapushd
o diretório pai, de modo quefind test
se tornafind .
, mas o resto dos comandos são os mesmos.-depth
aqui, ou seja, Causa encontrar para realizar uma travessia em profundidade, ou seja, os diretórios são visitados em pós-ordem e todas as entradas em um diretório atuarão antes do próprio diretório. Eu acho que é relevante aqui.Você pode usar o seguinte comando:
fonte
Esta é a versão que achei mais interessante. Se executado a partir do diretório interno , ele excluirá todos os diretórios vazios abaixo (um diretório é considerado vazio se contiver apenas diretórios vazios).
A opção mindepth impede que o próprio diretório seja excluído se estiver vazio.
fonte
rmdir --ignore-fail-on-non-empty -p directory
para se livrar dos pais.find . -type d -empty
encontra e lista diretórios e subdiretórios vazios na árvore atual. Por exemplo, lista resultante de diretórios e subdiretórios vazios:
Nenhuma operação é feita nos diretórios. Eles são simplesmente listados. Isso funciona para mim.
fonte
Apenas encontre diretórios vazios
Para encontrar apenas diretórios vazios (conforme especificado no título da pergunta), a resposta do mosg está correta:
Mas
-empty
pode não estar disponível emfind
versões muito antigas (é o caso do HP-UX, por exemplo). Se este for o seu caso, consulte as técnicas descritas na seção a seguir Um diretório está vazio? .Excluir diretórios vazios
Isso é um pouco complicado: suponha que um diretório
MyDir
contenha diretórios vazios. Depois de remover esses diretórios vazios,MyDir
ele se tornará um diretório vazio e também deve ser removido. Portanto, eu uso o comandormdir
com a opção--parents
(ou-p
) que também remove os diretórios pais quando possível:Na
find
versão mais antiga, a instrução+
ainda não é compatível, portanto, você pode usar em seu;
lugar:O diretório está vazio?
A maioria dessas respostas explica como verificar se um diretório está vazio. Portanto, apresento aqui as três técnicas diferentes que conheço:
[ $(find your/dir -prune -empty) = your/dir ]
uma variação:
Explicação:
find -prune
é semelhante afind -maxdepth 0
usar menos caracteresfind -type d
imprime diretórios apenasfind -empty
imprime os diretórios e arquivos vazios(( ${#files} ))
Este truque é 100%,
bash
mas invoca (gera) um sub-shell. A ideia é de Bruno De Fraine e melhorada pelo comentário do teambob . Eu aconselho este se você usarbash e se seu script não precisa ser portátil.Observação: não há diferença entre um diretório vazio e um não existente (e mesmo quando o caminho fornecido é um arquivo).
[ $(ls -A your/dir) ]
Este truque foi inspirado no artigo da nixCraft postado em 2007. Andrew Taylor respondeu em 2008 e gr8can8dian em 2011.
ou a versão de bashismo de uma linha:
Nota:
ls
retorna$?=2
quando o diretório não existe. Mas não há diferença entre um arquivo e um diretório vazio.fonte
rmdir -vp
me ajudou imensamente, já que eu precisava não apenas excluir todos os diretórios vazios em uma raiz, mas verificar se há diretórios vazios e diretórios pai após excluir um arquivo. Na minha situação, diretórios vazios funcionam, desde que não estejam na árvore da qual estou removendo um arquivo. Obrigado!Esta função recursiva parece fazer o truque:
Dada esta estrutura de diretório de exemplo:
O resultado da execução dessa função seria:
que falta
/dir4/dirD
. Se você mover a chamada recursivafindempty "$dir"
após ofi
, a função incluirá esse diretório em seus resultados.fonte
Que tal
rmdir *
? Esse comando falhará em diretórios não vazios.fonte
rmdir */*/* */* *
Embora que não lida com 'arquivos de ponto', mas em situações manuais (arquivos de dados de limpeza) você geralmente não espera 'arquivos de ponto'. Os métodos recursivos, entretanto, são para uma limpeza geral mais automatizada, especialmente em estruturas de diretório muito grandes.O comando a seguir retorna 1 se um diretório está vazio (ou não existe) e 0 caso contrário (portanto, é possível inverter o código de retorno com
!
em um script de shell):fonte
Criei uma estrutura simples da seguinte maneira:
O
test/test3/file
contém algum texto inútil.A emissão
find test -empty
retorna "test/test2/test2.2
" como o único diretório vazio.fonte
uma abordagem simples seria,
Além disso,
fonte
fonte