Como excluir esta pasta / atual / ponto da localização "tipo d"

186
find . -type d

pode ser usado para encontrar todos os diretórios abaixo de algum ponto de partida. Mas ele também retorna o diretório atual ( .), que pode ser indesejável. Como pode ser excluído?

Matthias Ronge
fonte

Respostas:

194

Solução POSIX 7 :

find . ! -path . -type d

Para este caso em particular ( .), o golfe é melhor que a mindepthsolução (24 vs 26 caracteres), embora provavelmente seja um pouco mais difícil de digitar por causa do !.

Para excluir outros diretórios, isso será menos eficiente e requer uma variável para DRYness:

D="long_name"
find "$D" ! -path "$D" -type d

Minha árvore de decisão entre !e -mindepth:

  • roteiro? Use !para portabilidade.
  • sessão interativa no GNU?
    • excluir .? Jogue uma moeda.
    • excluir long_name? Use -mindepth.
Ciro Santilli adicionou uma nova foto
fonte
se você precisar excluir vários caminhos, basta fazê find /path/ ! -path "/path/first" ! -path "/path/second"-lo dessa maneira?
Vincent De Smet
2
@VincentDeSmet, você deseja excluir apenas esses caminhos ou não recorrer a eles? Se apenas os caminhos, você pode usar find / ! -regex '/\(a\|b\)/.*'ou, mais simplesmente, canalizar através do grep. Para não recursar, o exposto acima seria muito ineficiente e você deve usar -prune: stackoverflow.com/questions/1489277/…
Ciro Santilli Última atualização: 28/07/2015
meu problema foi o seguinte: eu queria excluir recursivamente tudo em um diretório, exceto um subdiretório. Eu estava usando findcom greppara excluir o diretório, mas o diretório pai ainda estava lá, fazendo com que tudo fosse excluído de qualquer maneira.
Vincent De Smet
@VincentDeSmet Não vejo uma solução direta find, você precisa procurar prefixos: stackoverflow.com/questions/17959317/… Mas um Bash for loop pode lidar com isso :-)
Ciro Santilli 郝海东 冠状 病 六四
Você provavelmente deseja escapar do ponto de exclamação char ( \!) para estar do lado seguro. Todos os exemplos nas minhas máquinas man findescaparam, então parece que é provavelmente uma boa idéia ™. Edit - Acabei de notar que ele mesmo diz explicitamente:! expr True if expr is false. This character will also usually need protection from interpretation by the shell.
Adrian Günter
201

Não apenas a profundidade de recursão de findpode ser controlada pelo -maxdepthparâmetro, a profundidade também pode ser limitada de "superior" usando o -mindepthparâmetro correspondente . Então, o que realmente precisamos é:

find . -mindepth 1 -type d
Matthias Ronge
fonte
5
obras sobre GNU encontrar, mas, infelizmente, é uma extensão GNU ao achado POSIX 7 , e até mesmo a LSB utiliza utilitários de shell POSIX (não o GNU estendida queridos)
Ciro Santilli郝海东冠状病六四事件法轮功
6
Isso funcionou para mim. Ou seja:find . -mindepth 1 -maxdepth 1 -type d ...
racl101
19

Uso find ./* <...>quando não me importo de ignorar arquivos de ponto de primeiro nível (o *glob não os corresponde por padrão no bash - veja a opção 'dotglob' no shopt interno: https://www.gnu.org/software/bash /manual/html_node/The-Shopt-Builtin.html ).

eclipse tmp # find.
.
./tela
./screen/.testfile2
./.X11-unix
./.ICE-unix
./tmux-0
./tmux-0/default
eclipse tmp # find ./*
./tela
./screen/.testfile2
./tmux-0
./tmux-0/default
Milos Ivanovic
fonte
PARA SUA INFORMAÇÃO. não use esse truque com a -execopção Por exemplo, se você tentar find dir/* -type d -exec rmdir {} \;, verá erros.
plhn
Você está enganado, ou talvez mal orientado. Esse comando funcionará bem. Se você estiver vendo erros, eles serão provenientes rmdire provavelmente lhe finddirão que os diretórios não estão vazios, pois farão uma pesquisa profunda nos diretórios, mostrando os pais antes dos filhos.
Milos Ivanovic
2
Nota: "ignorar arquivos de ponto de primeiro nível" também significa excluir todos os arquivos / diretórios ocultos.
Jonathan H
2

Bem, uma solução simples também (a solução não estava funcionando para mim no windows git bash)

find * -type d

Pode não ter muito desempenho, mas faz o trabalho e é o que precisamos às vezes.

[Editar]: Como o @AlexanderMills comentou, ele não mostrará diretórios ocultos no local raiz (por exemplo ./.hidden), mas mostrará subdiretórios ocultos (por exemplo ./folder/.hiddenSub). [Testado com git bash no windows]

StackHola
fonte