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?

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.

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

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

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]

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.