Como encontrar pastas com mais de 1GB e executar outro comando no terminal linux?

5

Eu quero encontrar as pastas cujos tamanhos são mais de 1GB e, em seguida, se eles estiverem acabados, quero apagá-los.

Eu encontrei alguns comandos como

find /some/path -type d -size +1G -exec ls {} \;

ou

du -h /some/path | grep ^[0-9.]*G

ou (acima de 600M)

du -h /some/path/ | grep ^[6-9][0-9][0-9][0-9.]*M | sort

Mas esses dois comandos não estão me ajudando, porque o comando find não está encontrando nenhuma pasta, embora existam pastas com mais de 1GB, mas o Linux acha que elas são um pouco de KB pequeno. Existe algum comando para conseguir isso?

    
por xmux 25.07.2012 / 12:11

6 respostas

4

Um problema comum ao lidar com nomes de arquivos / diretórios é quando eles contêm espaços em branco. * Os caminhos de arquivo nix podem conter \n newlines. Para contornar todos os problemas de espaço em branco, você precisa trabalhar com um delimitador nulo \x00 .

#!/bin/bash
#
# Parameter 1 ("$1"):  Remove sub-directories from this directory
# Parameter 2 ("$2"):  Remove sub-directories larger than this many bytes 
#
# Example, To remove sub-directories bigger than 1 GB from your HOME directory
#   
#    script "$HOME"  $((2**30))     
#        
dir="$1"; shopt -s extglob; dir="${dir%%+(/)}"  # remove trailing / from directory path
[[ -d "$dir" ]] || { echo "\: directory NOT found: $1"; exit 1; }

size=$2  # size in bytes
[[ -z $2 || -n ${2//[0-9]} ]] && { echo "\: size-threshold must be numeric: $2"; exit 2; }

du -0b "$dir" |                        # output with \x00 as end-of-path
 sort -zrn  |                          # sort dirs,largest first
  awk -vRS="\x00" -vORS="\x00" -v"size=$size" -v"dir=$dir" -v"prev=\x00" '{
     if( $1<=size ) next               # filter by size; skip small dirs
     match( $0, "\x09" )               # find du TAB-delimiter           
     path = substr( $0, RSTART+1 )     # get directory path 
     if( path ~ "^"dir"/*$" ) next     # filter base dir; do not kill it! 
     match( path, "^" prev ".+" )      # print (ie. process) parent dirs only
     if( RSTART == 0 ) { print path }
     prev = path }' |
   xargs -0 -I{} echo rm -vr {}        # remove the 'echo' to run live!!!!
    
por 25.07.2012 / 18:34
1

O que você está pedindo é uma ideia terrível. Isso ocorre principalmente porque o que você pediu funciona: Se uma pasta foo contiver mais de 1 GB, cada pasta pai de foo também conterá mais do que isso (porque contém a pasta foo ).

Assim, se você digitalizar /home/myuser/myfolder/ para itens maiores e /home/myuser/myfolder/bar/quz/baz/foo , /home/myuser/myfolder/bar/quz/baz , /home/myuser/myfolder/bar/quz/ /home/myuser/myfolder/bar/ e /home/myuser/myfolder/ serão todos marcados para exclusão.

Você pode contornar isso com a opção -S para du.

Isso dá um resultado (QUE NÃO RECOMENDO EXECUTAR)

du -Sb $DIR | grep '^[0-9]\{10\}' | cut -f 2- | xargs -d "\n" rm -rf

Isso falhará em diretórios cujos nomes contenham caracteres de nova linha. Consertar isso para não ter essa falha é deixado como um exercício para o leitor.

Se você quiser outro tamanho, crie um regex para corresponder a ele. du -b retorna tamanhos em bytes, então trabalhe a partir daí. DICA: 365 MB ou mais seria '^\([0-9]\{10\}\|[4-9][0-9]\{8\}\|3[7-9][0-9]\{7\}\|36[6-9][0-9]\{6\}\)' .

    
por 26.07.2012 / 00:31
1

Para encontrar pastas maiores que 10G: du -h /mnt/backup/ |awk '$1 ~ /[0-9]*G/ {print}' |sort -nr|sed 's/G//g' |awk '{ if ( $1 > 10.0 ) print }'

Você pode alterar o 10.0 para qualquer número e / mnt / backup para qualquer caminho, ele irá imprimir pastas que combinam com seu tamanho em GBs.

    
por 21.05.2013 / 18:19
1

Cuidado apaga todos os arquivos & Diretórios acima de 1 GB no caminho fornecido

du -sh -t1000000000 / algum / caminho / * | awk -F "" '{print $ 2}' | xargs rm -rf

    
por 03.09.2015 / 08:51
0

use du -h para obter uma lista dos arquivos e diretórios com seus tamanhos. Em seguida, você pode usar sed para extrair os nomes das pastas que deseja apagar e passá-los para rm . Isso pode ser implementado como um script bash ou um comando em qualquer shell que você desejar. Se você precisar de mais ajuda para escrever o comando, me avise. Embora a leitura das man pages dos comandos acima o ajude a realizar sua tarefa.

    
por 25.07.2012 / 12:39
0

você pode encontrar as pastas usando du -sm * | awk '$1 > 1000'

    
por 24.08.2017 / 09:31