![Como remover arquivos do mesmo tamanho em um diretório no Linux?](https://rvso.com/image/164714/Como%20remover%20arquivos%20do%20mesmo%20tamanho%20em%20um%20diret%C3%B3rio%20no%20Linux%3F.png)
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 -zuDw20
relata todas as entradas, exceto a última, com os primeiros 20 bytes duplicados.
Remova o echo
quando estiver feliz.
Entre as coisas que você fez de errado:
read -d '' i
deveria estarIFS= 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.