Como filtrar du saída?

0

Para que não mostre os diretórios que contêm um arquivo vazio chamado "0k" que eu uso como sinalizador? Parece que --exclude não consegue lidar com isso.

    
por useful 12.07.2017 / 10:55

4 respostas

2

du pode aceitar uma lista de arquivos ou diretórios do stdin (ou versões suficientemente novas podem, de qualquer forma). Então você pode usar find e amigos para filtrar e fornecer esta lista:

find Pictures -mindepth 2 -type d \( -execdir test -f '{}/0k' \; -o -print0 \) |
  du --files0-from=- -h
  • Com -mindepth 2 , find listará apenas os diretórios ( -type d ) com pelo menos dois níveis de profundidade (então Pictures/*/* )
  • Em cada um desses diretórios, find executará test -f "{}/0k" , que simplesmente testa a existência de um arquivo denominado 0k . ( {} será substituído por find com o diretório.)
    • Se o teste for bem sucedido, nada acontece. Caso contrário, o caminho do diretório é impresso com um ASCII NUL no final ( -o print0 ).
    • A maneira como -o funciona, os execdir e -print0 precisam ser agrupados usando ( , ) .
  • du , então, obterá esses nomes de diretório e, felizmente, fornecerá o uso do disco.

Classificação:

find Pictures -mindepth 2 -type d \( -execdir test -f '{}/0k' \; -o -print0 \) |
  du --files0-from=- -h |
  sort -rh
    
por muru 24.07.2017 / 10:06
1

Se o seu arquivo vazio agindo como um sinalizador for chamado 0k , o comando a seguir lerá todos os subdiretórios no diretório atual que não contêm o arquivo. É claro que você pode alterar o . no início do loop for para qualquer caminho de diretório.

for dir in ./*; do if [[ ! -f "$dir"/'0k' ]]; then du -s "$dir" ; fi ; done

Você não mencionou na sua pergunta se precisa que isso seja inteiramente recursivo; se for, será um pouco mais complexo. O comando find pode ser usado aqui, o diretório de pesquisa pode ser alterado como acima:

find . -type d -exec bash -c 'if [[ ! -f "{}"/"0k" empty ]]; then du -s "{}"; fi' \;

Editar: Após o esclarecimento da tarefa do OP, o seguinte comando deve funcionar.

for dir in Pictures/*/*; do if [[ ! -f "$dir"/'0k' ]]; then du -s "$dir" ; fi ; done | sort -nr | head -n50
    
por Arronical 12.07.2017 / 13:57
1
#!/bin/bash
# Vars
NumLines="5" # output that many/few lines
MinSize=0 # filter out size folders lower than (MB)

while read DUout
do
    # get folder size
    Size="${DUout%%[[:space:]]*}"

    # get folder path
    Path="/${DUout#*/}"

    # Filter out if no 0k flagfile inside
[[ ! -f "${Path}/0k" ]] && echo "${DUout}"|cut -d"/" -f1,5-6
done < <(du -s -t${MinSize}M "${PWD}"/????/??????\ * | sort -nr) | head -"${NumLines}"
    
por useful 24.07.2017 / 09:36
0

Se todas as linhas que você deseja excluir contiverem uma determinada string (por exemplo, nome do arquivo), você poderá usar grep para filtrar os resultados de du .

Isso seria usado assim: du | grep -v -e "string_to_exclude" . O argumento -v para grep inverte a saída, de modo que somente as não correspondências são mostradas.

    
por Brendon Boldt 12.07.2017 / 11:32