Como eu excluo todos os diretórios vazios em um diretório da linha de comando?

46

Digamos que eu tenha um diretório chamado foo/ . Esta pasta inclui subdiretórios. Como posso excluir todos os diretórios vazios em um comando?

    
por justingrif 30.10.2011 / 03:44

4 respostas

98

Experimente este comando:

find . -empty -type d -delete

O comando find é usado para procurar arquivos / diretórios que correspondam a um critério de pesquisa específico do caminho especificado, neste caso, o diretório atual (daí o . ).

A opção -empty é válida para qualquer arquivo e diretório vazio.

A opção -type d é válida para o tipo arquivo especificado; neste caso, d significa o tipo de arquivo diretório .

A opção -delete é a ação a ser executada e vale para todos os arquivos encontrados na pesquisa.

    
por Bill 30.10.2011 / 04:10
7
rmdir *

Exclui todos os diretórios vazios. Ele vai lançar um erro para cada diretório e arquivo não vazio, para impedir que esses erros atravancem o seu terminal, use

rmdir * 2> /dev/null
    
por evilsoup 11.12.2012 / 23:20
7

Você pode aproveitar a recusa do comando rmdir de excluir diretórios não vazios e a opção find -depth para percorrer a árvore de diretórios de baixo para cima:

find . -depth -exec rmdir {} \;  

(e ignore os erros) ou anexe 2>/dev/null para realmente ignorá-los.

A opção -depth para find começa a encontrar na parte inferior da árvore de diretórios.

rm -rf excluirá todos os arquivos no diretório (e seus subdiretórios, e ....) E todos os diretórios e tudo mais.

    
por waltinator 27.12.2011 / 01:46
0

abordagem Python

$ tree                                                                                                                                                                                  
.
├── empty_dir1
├── empty_dir2
├── subdir1
│   ├── file1.abc
│   └── file2.abc
└── subdir2
    ├── file1.abc
    └── file2.abc

4 directories, 4 files
$ python -c 'import os;empty=[r for r,s,f in os.walk(".") if not f and not s and r != "." ];map(lambda x: os.rmdir(x),empty)'
$ tree
.
├── subdir1
│   ├── file1.abc
│   └── file2.abc
└── subdir2
    ├── file1.abc
    └── file2.abc

Isso funciona assim:

  • usamos a função os.walk() para percorrer recursivamente a árvore de diretórios. Em cada iteração r está definida para a pasta atual que estamos acessando, s contém uma lista de diretórios dentro de r e f conterá uma lista de arquivos nessa pasta. É claro que se f e s estiverem vazios, sabemos que r está vazio.
  • a primeira compreensão da lista nos permite criar empty , a lista de todos os diretórios que estão vazios, com base na avaliação mencionada acima.
  • segunda função, map() é usado para executar os.rmdir() em cada item na lista empty . A compreensão da lista pode ser usada, assim como alternativa.

Como script, isso seria assim:

#!/usr/bin/env python
import os
empty=[]
for r,s,f in os.walk("."):
    if not f and not s and r != ".":
        empty.append(r)

for i in empty:
    os.rmdir(i)
    
por Sergiy Kolodyazhnyy 13.07.2017 / 05:24