Como remover arquivos do mesmo tamanho em um diretório no Linux?

Como remover arquivos do mesmo tamanho em um diretório no Linux?

Preciso remover arquivos com tamanho idêntico, mas com conteúdo não idêntico no Linux, por isso fdupes não é uma opção.

Tentei o seguinte comando, mas ele não removeu todos os arquivos com tamanhos idênticos (não faço ideia do porquê)

last=-1; find . -type f -name '*.png' -printf '%f\0' | sort -nz | while read -d '' i; do s=$(stat -c '%s' "$i"); [[ $s = $last ]] && rm "$i"; last=$s; done

Alguma ideia? O que eu fiz de errado?

EDIT: cometi um erro na postagem inicial. Precisomanterum arquivo do tamanho fornecido, por exemplo:

1.png    # 23,5 Kb
2.png    # 24,6 Kb
4.png    # 24,6 Kb > remove
8.png    # 24,6 Kb > remove
16.png   # 23,5 Kb

Basicamente, quero remover duplicatas, mas não por soma de verificação e apenas por tamanho.

Responder1

Como você parece estar em um sistema GNU, você poderia fazer algo como:

(export LC_ALL=C
find . -name '*.png' -type f -printf '%20s %p\0' |
  sort -z |
  uniq -zuDw20 |
  cut -zb22- |
  xargs -r0 echo rm -f --
)

Isso imprime um tamanho preenchido de 20 caracteres seguido pelo caminho do arquivo para cada arquivo e uniq -zuDw20relata todas as entradas, exceto a última, com os primeiros 20 bytes duplicados.

Remova o echoquando estiver feliz.

Entre as coisas que você fez de errado:

  • read -d '' ideveria estar IFS= read -rd '' i. VerCompreendendo "IFS = read -r line"
  • %fé apenas o nome do arquivo, não seus caminhos completos, portanto isso funcionará apenas para nomes de arquivos no diretório atual.
  • você está comparando o tamanho de um arquivo com o tamanho do arquivo anterior, mas está classificando a lista de arquivos por nome, não por tamanho. Portanto, arquivos com o mesmo tamanho não serão necessariamente consecutivos nessa lista.

informação relacionada