Excluir arquivos com o mesmo tamanho, mas manter sempre um arquivo?

1

Eu tenho um diretório cheio de arquivos zip, que contém muitos arquivos. Eles são criados por software e isso não é atualmente corrigível. Eu tentei trabalhar com fdupes , mas esse processo demorou muito, porque existem cerca de 50k arquivos. Eu sei que todos os arquivos com o mesmo tamanho são duplicados, sem exceções.

Então, como eu poderia excluir todos os arquivos inúteis? Eu já tenho esse comando que me imprime os arquivos, mas não sei como converter isso em um oneliner para usá-lo como cronjob.

find . -type f -printf "%s %p\n" | grep "zip" | sort -n | uniq -d --check-chars=10
-rw-r--r--  1 root root 2550472 Apr 22 14:40 save_2016-04-22-14_40_01.zip
-rw-r--r--  1 root root 2550472 Apr 22 14:45 save_2016-04-22-14_45_01.zip
-rw-r--r--  1 root root 2550472 Apr 22 14:50 save_2016-04-22-14_50_01.zip
-rw-r--r--  1 root root 2550472 Apr 22 14:55 save_2016-04-22-14_55_01.zip
-rw-r--r--  1 root root 2550472 Apr 22 15:00 save_2016-04-22-15_00_01.zip
-rw-r--r--  1 root root 2550472 Apr 22 15:05 save_2016-04-22-15_05_01.zip
-rw-r--r--  1 root root 2550472 Apr 22 15:10 save_2016-04-22-15_10_01.zip
-rw-r--r--  1 root root 2550472 Apr 22 15:15 save_2016-04-22-15_15_01.zip
-rw-r--r--  1 root root 2550472 Apr 22 15:20 save_2016-04-22-15_20_01.zip
-rw-r--r--  1 root root 2550472 Apr 22 15:25 save_2016-04-22-15_25_01.zip
-rw-r--r--  1 root root 2550472 Apr 22 15:30 save_2016-04-22-15_30_01.zip
-rw-r--r--  1 root root 2550472 Apr 22 15:35 save_2016-04-22-15_35_01.zip
-rw-r--r--  1 root root 2550472 Apr 22 15:40 save_2016-04-22-15_40_01.zip
-rw-r--r--  1 root root 2550472 Apr 22 15:45 save_2016-04-22-15_45_01.zip
-rw-r--r--  1 root root 2550472 Apr 22 15:50 save_2016-04-22-15_50_01.zip
-rw-r--r--  1 root root 2550472 Apr 22 15:55 save_2016-04-22-15_55_01.zip #keep
-rw-r--r--  1 root root 2556836 Apr 22 16:00 save_2016-04-22-16_00_01.zip
-rw-r--r--  1 root root 2556836 Apr 22 16:05 save_2016-04-22-16_05_01.zip #keep
-rw-r--r--  1 root root 2586848 Apr 22 16:10 save_2016-04-22-16_10_01.zip
-rw-r--r--  1 root root 2586848 Apr 22 16:15 save_2016-04-22-16_15_01.zip
-rw-r--r--  1 root root 2586848 Apr 22 16:20 save_2016-04-22-16_20_01.zip #keep
-rw-r--r--  1 root root 2590213 Apr 22 16:25 save_2016-04-22-16_25_01.zip
-rw-r--r--  1 root root 2590213 Apr 22 16:30 save_2016-04-22-16_30_01.zip
-rw-r--r--  1 root root 2590213 Apr 22 16:35 save_2016-04-22-16_35_01.zip
-rw-r--r--  1 root root 2590213 Apr 22 16:40 save_2016-04-22-16_40_01.zip
-rw-r--r--  1 root root 2590213 Apr 22 16:45 save_2016-04-22-16_45_01.zip #keep

O comando acima imprime algo assim:

2590215 ./save_2016-04-25-14_20_01.zip
2590216 ./save_2016-04-25-14_00_01.zip
2590259 ./save_2016-05-17-13_10_01.zip
2590278 ./save_2016-05-17-13_35_01.zip
2590286 ./save_2016-05-17-13_50_01.zip
2590291 ./save_2016-05-17-14_25_01.zip
2590294 ./save_2016-05-17-13_55_01.zip

Alguma idéia? Eu também não tenho direitos para instalar mais software, apenas os comandos estão disponíveis como para o servidor Ubuntu 14.04.2 LTS.

    
por CodeBrauer 27.05.2016 / 15:57

2 respostas

1

Já que você já tem o comando que arquivos manter, você pode combinar isso com o comando de movimentação mv . Basta movê-los para outra pasta (dê outro prefixo a eles), exclua os arquivos restantes e mova-os de volta.

Dê uma olhada no parâmetro -t de mv . Você pode usar isso para especificar o destino e, em seguida, canalizar vários arquivos para mv.

    
por 27.05.2016 / 16:02
0

Pode não ser vital, mas você deve estar ciente de que dois zips podem ser diferentes, mesmo que seus tamanhos em bytes sejam iguais. Se você deseja se livrar do perigo, você pode verificar o md5sum dos arquivos. Ainda não é uma garantia de 100% para excluir apenas duplicatas, mas suas chances são muito melhores.

Esta é uma maneira de fazer isso usando o awk para enviar os nomes dos arquivos para xargs para exclusão (amostra com meus arquivos):

$ ls -l [a-d][1-3].txt
-rw-rw-r-- 1 lx lx 2 May 27 16:39 a1.txt
-rw-rw-r-- 1 lx lx 3 May 27 16:39 a2.txt
-rw-rw-r-- 1 lx lx 4 May 27 16:39 a3.txt
-rw-rw-r-- 1 lx lx 2 May 27 16:39 b1.txt
-rw-rw-r-- 1 lx lx 3 May 27 16:39 b2.txt
-rw-rw-r-- 1 lx lx 4 May 27 16:39 b3.txt
-rw-rw-r-- 1 lx lx 2 May 27 16:39 c1.txt
-rw-rw-r-- 1 lx lx 3 May 27 16:39 c2.txt
-rw-rw-r-- 1 lx lx 4 May 27 16:39 c3.txt
-rw-rw-r-- 1 lx lx 2 May 27 16:39 d1.txt
-rw-rw-r-- 1 lx lx 3 May 27 16:39 d2.txt
-rw-rw-r-- 1 lx lx 4 May 27 16:39 d3.txt
$ md5sum [a-d][1-3].txt | sort -k1 | awk '$1==prevsum {print $2}; {prevsum=$1}' | xargs  rm
$ ls -l [a-d][1-3].txt
-rw-rw-r-- 1 lx lx 2 May 27 16:39 a1.txt
-rw-rw-r-- 1 lx lx 3 May 27 16:39 a2.txt
-rw-rw-r-- 1 lx lx 4 May 27 16:39 a3.txt

Como não me importo com o tamanho dos arquivos e sei o padrão de nomenclatura dos arquivos, nem preciso usar o find.

    
por 27.05.2016 / 16:53