Excluindo alguns dos maiores arquivos em um diretório

1

Gostaria de excluir um determinado número dos maiores arquivos em um diretório.

Eu posso obter os nomes dos dez primeiros com:

ls -S | head (ou mais rico, embora mais complexo para analisar ls -lS | head )

Como eu passaria isso para o rm? via xargs?

Então ls -S | head | xargs rm funcionaria (mesmo com nomes de arquivos com espaços, etc?)

Existe uma maneira melhor / mais segura?

Desculpe, mas eu não pude testar isso sozinho com medo de goofing (o diretório tem coisas que eu realmente não quero zapear).

Eu uso o macOS.

    
por Robert Alexander 23.10.2016 / 17:30

5 respostas

2

So would ls -S | head | xargs rm work (even with filenames with spaces etc?)

Não. Por padrão, xargs divide em qualquer espaço em branco, não apenas em novas linhas. E você não pode ver isso com | xargs echo , pois echo imprime todos os seus argumentos, separados por espaços. (Algo como | xargs printf "%s\n" iria imprimi-los separados por novas linhas, assim você verá se a divisão acontece no meio de um nome de arquivo.)

Pelo menos o GNU xargs tem -d '\n' para dividir apenas em novas linhas, e muitas versões do xargs têm -0 para dividir em caracteres NUL (vai com find -print0 ). Você quer o primeiro, pelo menos, mas no caso geral, os nomes dos arquivos também podem conter novas linhas, caso em que head também não será muito útil.

Eu sou obrigado a avisar que analisar a saída de ls é considerado errado , aparentemente pelo menos algumas versões mangle a saída mesmo sem a presença de novas linhas. (Você pode estar seguro se não tiver novas linhas ou caracteres não imprimíveis, talvez.)

    
por 23.10.2016 / 20:36
1

Eu usaria uma abordagem diferente. Algo parecido com isto:

size=20000 # set a limit (in bytes), above these we will delete

for file in *
do
  [[ -f "$file" ]] || continue

  fileSize=$(stat --format "%s" "$file")

  if (( $fileSize > $size )) # if file is bigger than 20000 bytes
  then
    rm "$file" # delete the file
  fi          
done

Dessa forma, você poderá excluir arquivos com espaços neles e pode decidir com a variável $size quais arquivos são realmente "grandes". Se você quiser ser avisado antes de cada exclusão, use a opção -i : rm -i

Editar:
Acabei de perceber que você está executando isso no OS X. Eu não tenho acesso a nenhuma máquina com o OS X no momento, pode haver um risco de que o OS X stat tenha um formato diferente para obter o tamanho. Em outras palavras, a opção --format "%s" pode não funcionar. Verifique man stat no OS X!

    
por 23.10.2016 / 19:20
0

eu iria com;

find . -type f -size +10M -delete -print

Se você realmente quer seguir o caminho ls, talvez;

ls -S | head -1 | while read af; do rm "$af"; done
    
por 23.10.2016 / 20:10
0

Funcionará, mas as seguintes coisas precisam ser lembradas:

  • Aqui rm não vai perguntar se você realmente deseja excluir o arquivo.
  • Isso não excluirá arquivos que contenham espaço em seus nomes.
por 23.10.2016 / 19:18