Como posso listar todos os arquivos e pastas além de um limite de tamanho especificado?

7

Em uma partição eu tenho vários arquivos e pastas, e posso listar todos os tamanhos de arquivo com du assim:

du -h

Mas como posso listar todos os arquivos que estão além de um tamanho específico de espaço em disco como 5MB?

    
por Ten-Coin 27.12.2012 / 13:07

3 respostas

0

Aqui está uma solução direta no bash, que analisa o tamanho de arquivos e pastas:

#!/bin/bash

folder=""
limit=""

IFS=$'\n'
for item in 'find "$folder"'; do
    size=$(du -s "$item" | cut -f1)
    if [ $size -gt $limit ]; then
        echo $item
    fi
done

primeiro param é a pasta de destino a examinar
segundo param é o limite em kilobytes, onde 1K = 1024 bytes.

    
por Pavel A 27.12.2012 / 13:46
10
find /home/stephenm/ -maxdepth 1 -size +20k -exec du -h {} \;

Isso deve listar qualquer coisa acima de 20k em / home / stephenm

para reciclar em subdiretórios, solte a opção -maxdepth 1 .

    
por stedotmartin 27.12.2012 / 13:19
1

Tenha cuidado: du não imprime o tamanho de um arquivo, ele fornece uma estimativa do uso do espaço no arquivo.

Você pode criar um arquivo de 10 MB, que usa muito menos:

dd if=/dev/zero of=file seek=10M count=1 bs=1
stat -c %s file
ls -lh file
du -h file
cat file | wc

Um exemplo é um arquivo compactado que usa menos espaço no disco que seu tamanho, como o exemplo acima de um arquivo esparso .

No exemplo acima, find . -type f -size +5M produzirá file mesmo se du for muito menor que 5M.

Se você sabe que não tem novas linhas em seus nomes de arquivos, pode filtrar a saída de find com:

find . -type f -size +5M | while IFS= read -r file; do
  du=$(du -k "$file")
  size="${du%%$(printf "\t")*}"
  if test $size -gt $((5 * 1024)); then
    echo "$file"
  fi
done

Se você pode ter novas linhas em seus nomes de arquivos, você pode usar esta extensão GNU, mas depois usar algo diferente de echo no loop:

find . -type f -size +5M -print0 | while IFS= read -r -d '' file; do
  du=$(du -k "$file")
  size="${du%%$(printf "\t")*}"
  if test $size -gt $((5 * 1024)); then
    echo "$file"
  fi
done
    
por jfg956 27.12.2012 / 18:34