Excluindo alguns dos maiores arquivos de um diretório

Excluindo alguns dos maiores arquivos de um diretório

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

Posso obter os nomes dos arquivos dos dez primeiros com:

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

Como eu passaria isso para rm ? via xargs?

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

Existe uma maneira melhor/mais segura?

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

Eu uso macOS.

Responder1

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

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

Pelo menos o GNU xargs precisa -d '\n'ser dividido apenas em novas linhas, e muitas versões de xargs precisam -0ser divididas em caracteres NUL (vai com find -print0). Você vai querer pelo menos o primeiro, mas no caso geral os nomes dos arquivos também podem conter novas linhas, caso em que headtambém não adiantará muito.

Sou obrigado a avisar queanalisar a saída de lsé considerado errado, aparentemente pelo menos algumas versões irão alterar 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.)

Responder2

Eu usaria uma abordagem diferente. Algo assim:

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á deletar arquivos com espaços e poderá decidir com a $sizevariável quais arquivos realmente são "grandes". Se você quiser ser avisado antes de cada exclusão, use a -iopção:rm -i

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

Responder3

eu iria com;

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

Se você realmente quiser seguir o mesmo caminho, talvez;

ls -S | head -1 | while read af; do rm "$af"; done

Responder4

Usarzsh. Possui um método para classificar e selecionar arquivos por tamanho (e por data, que é usado com mais frequência). Zsh faz parte da instalação padrão no OSX/macOS, mas pode precisar ser instalado separadamente em outras variantes do Unix.

A maneira de selecionar (e classificar) arquivos usando critérios diferentes do nome éeliminatórias globais. Por exemplo, para listar os 10 maiores arquivos em um diretório, use OLpara classificar por tamanho decrescente (euength) e [1,10]para listar os 10 primeiros:

ls -ldU *(OL[1,10])

Fazer isso sem zsh é mais complicado, especialmente se você precisar lidar com nomes de arquivos que contenham caracteres especiais. Contanto que os nomes dos arquivos não contenham caracteres não imprimíveis ou novas linhas, você poderá analisar a saída de ls.

ls -S | head -n 10 | while read -r filename; do echo rm -- "$filename"; done

informação relacionada