Como combinar * com arquivos ocultos dentro de um diretório

21

Como combinar os arquivos ocultos dentro dos diretórios fornecidos

por exemplo

Se eu der o comando abaixo, não está dando o resultado dos arquivos ocultos,

 du -b maybehere*/*

como conseguir isso simples usando um único comando em vez de usar

du -b maybehere*/.* maybehere*/*

como eu preciso digitar talvez duas vezes aqui.

vidhan
fonte
Tente apenas oculto maybehere*/.*e acrescente acima para todos #
Costas
11
Sua edição faz uma nova pergunta com restrições adicionais, que transformam o Q em um alvo em movimento, possivelmente invalidando as respostas já fornecidas. Isso é falta de educação, basta fazer uma nova pergunta, se você tiver uma.
Anthon

Respostas:

22

Aproveite a expansão da cinta:

du -b maybehere*/{*,.[^.],.??*}

ou alternativamente

du -b maybehere*/{,.[^.],..?}*

A lógica por trás disso provavelmente não é óbvia, então aqui está a explicação:

  • * corresponde a todos os arquivos não ocultos
  • .[^.]corresponde aos arquivos cujos nomes começaram com ponto único seguido por não um ponto; são apenas dois nomes de arquivo de caracteres na primeira forma.
  • .??* corresponde a arquivos ocultos com pelo menos 3 caracteres
  • ..?* como acima, mas o segundo caractere deve ser um ponto

O objetivo é excluir links físicos para o diretório atual e principal ( .e ..), mas incluir todos os arquivos normais de forma que cada um deles seja contado apenas uma vez!

Por exemplo, o mais simples seria apenas escrever

du -b maybehere*/{.,}*

Isso significa que a lista contém um ponto .e "nada" (nada está entre ,e fechando }), portanto, todos os arquivos ocultos (que começam em um ponto) e todos os arquivos não ocultos (que começam em "nada") corresponderiam. O problema é que isso também corresponderia .e .., e provavelmente não é o que você deseja, então temos que excluí-lo de alguma forma.


Palavra final sobre a expansão da cinta.

A expansão entre chaves é um mecanismo pelo qual você pode incluir mais arquivos / seqüências de caracteres / qualquer coisa na linha de comando escrevendo menos caracteres. A sintaxe é {word1,word2,...}, ou seja, é uma lista de sequências separadas por vírgula que começa {e termina com }. bashmanual fornece um exemplo de uso muito básico e ao mesmo tempo muito comum:

$ echo a{b,c,d}e
abe ace ade
jimmij
fonte
que é o uso do { }Eu não tenho idéia :( você pode me dar uma direção para obter mais informações sobre ele
Vidhan
@vidhan veja a edição e veja o man bashcapítulo "Brace Expansion".
jimmij
você se importaria de me dar mais explicações para o acima ans pouco mais claramente explicando como tudo funciona como eu sou novo com essas coisas @jimmij
Vidhan
6
.??*falha em corresponder .a, .b... .[^.]*falha em corresponder ..foo.
Stéphane Chazelas
4
.foocombina ambos .[^.]*e .??*. Você quer {.[!.],..?,}*.
Stéphane Chazelas
14

Como você já está usando a sintaxe específica do GNU ( -b):

du -abd1 maybehere*/

Dessa forma, é duque lista os arquivos nos maybehere*diretórios (e não exclui os arquivos de ponto). -d1limita o relatório de uso do disco a um nível inferior (incluindo os não diretórios -a).

Caso contrário, para que os globs incluam arquivos ocultos (exceto .e ..), cada shell possui sua própria sintaxe:

  • zsh:

    du -b maybehere*/*(D)
  • ksh93:

    (FIGNORE='@(.|..)'; du -b maybehere*/*)
  • bash:

    (shopt -s dotglob; du -b maybehere*/*)
  • tcsh:

    (set globdot; du -b maybehere*/*)
  • yash:

    (set -o dot-glob; du -b maybehere*/*)

    embora tenha cuidado, ele inclui .e ..em sistemas que os incluem e o resultado readdir() dificilmente pode ser usado.

Stéphane Chazelas
fonte
8

Outra opção está disponível aqui :

du -sm .[!.]* *
Fábio
fonte
Por que você deseja pular nomes de arquivos começando com ..?
Kusalananda
2
Presumivelmente, porque eles não querem listar tudo dentro ../e abaixo.
Shadur
Isso não conta arquivos como por exemplo ..myfile; adicione ..?*para isso. Mas +1 para usar a sintaxe glob adequada para correspondências negativas.
Pedro Gimeno
0

Se você deseja apenas listar diretórios ocultos ou operar em diretórios ocultos, como Costas disse, você pode usar

du -b maybehere*/.*

Isso permitirá que você opere em arquivos e diretórios ocultos. Se você quiser apenas diretórios ocultos, poderá especificar isso com

du -b maybehere*/.*/

SailorCire
fonte
por favor você pode ver a questão mais uma vez @SailorCire Eu editei um pouco
Vidhan
@vidhan então você só quer trabalhar escondido dentro de um diretório? Isso está correto?
SailorCire
Não, eu quero combinar arquivos ocultos e não ocultos dentro de um diretório, em vez de usar du maybehere*/.*e maybehere*/*um dos ocultos e outro para os não ocultos #
197
O @vidhan du -bpega ocultos e não ocultos.
SailorCire
não :( infelizmente @SailorCire
Vidhan
0

Embora não seja shell diretamente, você pode usar o find com profundidade limitada como esta

find maybehere -maxdepth 1 -exec du -sh {} \;
k3a
fonte