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?
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?
Respostas:
Tente este comando:
find . -empty -type d -delete
O find
comando é usado para procurar arquivos / diretórios que correspondam a um critério de pesquisa específico a partir do caminho especificado, neste caso, o diretório atual (daí o .
).
A -empty
opção é verdadeira para qualquer arquivo e diretório que esteja vazio.
A -type d
opção é verdadeira para o tipo de arquivo especificado; nesse caso, d
significa o diretório do tipo de arquivo .
A -delete
opção é a ação a ser executada e é verdadeira para todos os arquivos encontrados na pesquisa.
rm -rf <directory-name>
. Isso removerá o diretório, juntamente com todo o seu conteúdo, incluindo arquivos e subdiretórios. A -r
opção significa excluir recursivamente, enquanto o -f
comando significa não avisar antes de excluir. Se você deseja ser solicitado antes de excluir um diretório / arquivo, substitua a -f
opção pela -i
opção
stdout
comando de um (por exemplo find
) no stdin
outro (por exemplo rm
), no entanto, tenha muito cuidado, pois pode apagar ou excluir arquivos / diretórios que você não deseja excluir! Para mais informações sobre como fazer isso, consulte as man
páginas de cada um desses comandos. Para estar seguro, sempre teste essas coisas em um diretório temporário antes de experimentar a coisa real.
Você pode aproveitar a rmdir
recusa do comando em excluir diretórios não vazios e a find -depth
opção de percorrer a árvore de diretórios de baixo para cima:
find . -depth -exec rmdir {} \;
(e ignore os erros) ou acrescente-os 2>/dev/null
para realmente ignorá-los.
A -depth
opção para find
começar a localizar 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.
rmdir *
Excluirá todos os diretórios vazios. Irá gerar um erro para cada diretório e arquivo não vazio, para impedir que esses erros atrapalhem seu terminal, use
rmdir * 2> /dev/null
rmdir * 2>/dev/null || true
. (O find (1) é o melhor caminho para criação de scripts, mas por outro motivo: porque expressa melhor o que você quer fazer.)
$HOME
. Com um sorriso maligno.
find . -type d -empty -delete -maxdepth 1
Pois se você deseja excluir apenas os subdiretórios diretos de foo/
.
$ 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:
os.walk()
função para percorrer recursivamente a árvore de diretórios. Em cada iteração r
está definido para a pasta atual que está acessando, s
contém lista de diretórios dentro r
, e f
conterá lista de arquivos nessa pasta. É claro que se f
e s
estamos vazios, sabemos que r
está vazio.empty
, a lista de todos os diretórios vazios, com base na avaliação mencionada acima.map()
é usada para executar os.rmdir()
em cada item da empty
lista. A compreensão da lista pode ser usada e também alternativa.Como um script, 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)
/bin/sh
apenas e o Python é realmente uma linguagem mais elegante do que os dois.