Obtendo o tamanho das pastas pai ao usar find para procurar por critérios?

1

Eu estou procurando por uma determinada expressão regular dentro dos nomes de arquivos e estou procurando retornar as pastas pai com seus tamanhos de uma maneira única.

Por exemplo, aqui está o comando que eu esperava para funcionar:

find -E . -type f -regex '.*[fF][oO][oO].*' -maxdepth 2 | rev | cut -d'/' -f2- | rev | egrep -v '\.$' | uniq | xargs du -sh

Isso falhou com: xargs: unterminated quote graças a marcas de aspas variadas dentro dos nomes de arquivos.

Então acabei usando find com -print0 e xargs com -0 :

find -E . -type f -regex '.*[fF][oO][oO].*' -maxdepth 2 -print0 | rev | cut -d'/' -f2- | rev | egrep -v '\.$' | uniq | xargs -0 du -sh

Ainda assim, acabei com um erro: du: Binary file (standard input) matches , graças a uniq , aparentemente alterando a saída da formatação -print0 do find.

Como você sugeriria encontrar o tamanho da pasta pai ao procurar por qualquer arquivo ou pasta que correspondesse? Repito, eu simplesmente quero encontrar os nomes das pastas de nível superior com seus tamanhos acompanhantes ( du -sh ) e nenhum caminho de subpasta ou informações de arquivo para que eu acabe com apenas uma boa lista de pastas principais que tenham critérios correspondentes. / p>     

por ylluminate 21.08.2014 / 07:22

2 respostas

2

rev e egrep e uniq estão todos comendo seus zeros e vendo uma única linha. Se você tem o GNU find e uniq você pode simplificar muito isso:

find ...tests... -printf '%h
find ...tests... -printf '%h%pre%' | uniq -z | xargs -0 du -sh
' | uniq -z | xargs -0 du -sh

A opção find do GNU -printf usa um formato descrevendo a saída para cada arquivo. %h é o formato do caminho até, mas não incluindo o nome do arquivo, e, em seguida, uniq -z torna-o com terminação zero. cat diz para usar zeros para finalizar cada registro - caso contrário, ele só verá uma única linha e, basicamente, agirá como xargs . sort -z -u pode continuar como você tinha.

É possível que uniq seja melhor que . para explicar nomes fora de ordem, embora seus requisitos de profundidade máxima signifiquem que somente -mindepth 2 aparecerá mais de uma vez com qualquer coisa entre eles. %code% evitaria isso também.

Se nenhum dos seus nomes de arquivo tiver zeros neles

    
por 21.08.2014 / 07:55
1

A principal complicação em seus comandos de exemplo é obter o nome do diretório. Você pode ficar muito mais fácil, diretamente, com a opção -printf de find . Tem um formato para escrever apenas o diretório: %h . Usar isso deve permitir simplificar muito o seu comando.

Para escrever apenas os diretórios, use:

find ... -type f ... -printf '%h\n'

Você também pode usar isso para linhas %code% :

find ... -type f ... -printf '%h
find ... -type f ... -printf '%h\n'
'


O segundo comando na questão tem um problema extra: ele usa um canal de comandos que funcionam nas linhas, mas a entrada não é de linhas - não há novas linhas, já que você usa %code% para a terminação de linha. Para colocar de outra forma: toda a saída está em uma linha.

    
por 21.08.2014 / 07:52