Como posso ecoar a quantidade de bytes removidos de um rm -rf?

1

Eu tenho um alias

alias binobj="find . -iname "bin" -o -iname "obj" | xargs rm -rf"

Isso eu uso quando meu disco está quase cheio. Isso exclui as pastas "bin" e "obj", pesquisando recursivamente a partir da pasta atual.

Gostaria de saber como posso saber a soma total de todos os arquivos excluídos. Eu olhei para colocar um eco entre os dois comandos através de um pipe, mas, em seguida, o xargs não receberá os arquivos para excluir.

Eu estou em um mac, mas não tenho vergonha de adicionar pacotes. Eu só não quero colocar isso em outro arquivo (este é o meu .bash_profile ), como este sincroniza com todos os meus outros macs.

    
por user1009013 10.05.2017 / 12:17

2 respostas

1

Você precisará ser muito cuidadoso ao fazer um rastreamento recursivo para bin e obj ... por exemplo, você pode acidentalmente abrir arquivos ou diretórios importantes (por exemplo: .../.hg/store/data/obj ) que não seria um boa ideia.

Sempre que possível, você quer ser o mais preciso possível. Se você estiver tentando remover diretórios, especifique -type d para que você não corresponda acidentalmente a um arquivo / link simbólico / etc ...

Além disso, isso é grande o suficiente para se beneficiar de um conjunto de funções para legibilidade / manutenção.

Esse conjunto de funções (e, finalmente, um pipeline que pode ser colocado em alias / colocado em uma função) removerá todos os diretórios bin e obj que estão ao lado de um arquivo chamado makefile (insensitivo a maiúsculas e minúsculas). O total de bytes será gravado em stderr usando o shy numfmt para obter saída como " 9.1MB "

function getMakefiles {
    find . -type f -iname makefile
}

function getBinObjDirsNear {
    while read NEAR; do
        find $(dirname ${NEAR}) -type d -maxdepth 1 \( -iname bin -o -iname obj \)
    done
}

function calcTotal {
    TOTAL=0
    while read ENT; do
        TOTAL=$(( TOTAL + $(du -bc ${ENT} | tail -n 1 | cut -f 1) ))
        echo ${ENT}
    done
    numfmt --to=iec --suffix=B --format="%f" ${TOTAL} >&2
}

getMakefiles | getBinObjDirsNear | calcTotal | xargs -d '\n' rm -rf
    
por 18.05.2017 / 14:33
1

Eu simplesmente calcularia o tamanho antes de remover as pastas:

alias binobj="du -sc bin/ obj/ | grep total ; find . -iname "bin" -o -iname "obj" | xargs rm -rf"

O comando solicitará o tamanho adicional em bytes dos diretórios bin + obj do diretório atual; então execute para deletar.

Editar : De acordo com o comentário: bin e obj devem ser encontrados recursivamente:

Sem gastar muito tempo para encontrar uma solução elegante, eu registraria o tamanho de cada diretório antes de removê-lo e os computaria após a conclusão da limpeza. Um forro sujo poderia ser:

find . -iname "bin" -o -iname "obj" | xargs -I % sh -c "du -sb % >> /tmp/delreport.log; rm -rf %"; awk '{sum+=$1} END {print sum}' /tmp/delreport.log && rm /tmp/delreport.log

  • | xargs -I % sh -c "..." : permite que você coloque vários comandos com o parâmetro \%
  • du -sb : registrará o tamanho do repositório que será removido
  • awk '{sum+=$1} END {print sum}' : soma todo o tamanho na primeira coluna do relatório
por 15.05.2017 / 16:18

Tags