• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Masowe usuwanie powtarzających się plików.

0 głosów
66 wizyt
pytanie zadane 6 lutego w Systemy operacyjne, programy przez Paweł Soszyński Początkujący (260 p.)
Cześć!

Posiadam dużo plików .wav znajdujące się w jednym katalogu, które są ponumerowane od 1 do 10 000 (taką noszą nazwę; "1", "2", "3", itd.). Niektóre z nich są takie same. to znaczy nie różnią się niczym oprócz nazwy np. "1" i "134" oraz daty modyfikacji różniącej się o parę sekund z przyczyny wklejania ich masowo i po kolei. A teraz pytanie:

W jaki sposób masowo usunąć te powtarzające się pliku, tak aby został tylko jeden egzemplarz każdego? Np. tak jak w wyżej podanym przykładzie "1" zostaje, a "134" zostaje skasowane. Wiem, że da się to zrobić ręcznie, ale w przyszłości może nie być to 10 000 tylko dużo, dużo więcej.

Pozdrawiam serdecznie,
Paweł
3
komentarz 6 lutego przez Benek Maniak (67,140 p.)
Cały czas pytasz o podobne rzeczy. Przysiadłbyś jeden wieczór i się nauczył podstawowej obsługi linii komend...
komentarz 6 lutego przez Paweł Soszyński Początkujący (260 p.)
Konfrontując się z konkretnym problemem najlepiej jest mi się uczyć. Chodzi mi o wbicie gwoździ, dopiero daleko, daleko dalej interesuje mnie kwestia czy zrobię to młotkiem, butem czy konserwą. Dziękuję za motywujący komentarz :)

1 odpowiedź

+1 głos
odpowiedź 6 lutego przez Arkadiusz Sikorski Pasjonat (18,060 p.)
wybrane 7 lutego przez Paweł Soszyński
 
Najlepsza

Chyba CCleaner miał funkcję znajdowania i usuwania duplikatów.

Ewentualnie mógłbyś napisać skrypt, który oblicza skrót dla każdego pliku na ich podstawie usuwa duplikaty (skrót pliku dla plików o tej samej zawartości będzie różny).

Edit: ewentualnie w różnych dystrybucjach jest fdupes.

komentarz 7 lutego przez Paweł Soszyński Początkujący (260 p.)
Rozwiązałem problem z pomocą AllDub 4.2 :)
1
komentarz 7 lutego przez Arkadiusz Sikorski Pasjonat (18,060 p.)

A ja zrobiłem mały pythonowy skrypt, który wyszukuje nazwy zduplikowanych plików w podanym folderze, może komuś przyda się w przyszłości :)

(fdupes.py)

import mmap
import hashlib
import os
import collections
import argparse

_parser = argparse.ArgumentParser(
	description='''
		Returns filenames that are not unique (based on SHA1 digest) in a directory.'''
	
)
_parser.add_argument('path', type=str, help='path to a directory to search for duplicate files')
_parser.add_argument('--not_first', action='store_true', help='if Z, X, Y are duplicates, only X and Y are returned (no sorting)')
_parser.add_argument('--sort_asc', action='store_true', help='sorts not unique files by name (ascending), may affect performance')
_parser.add_argument('--sort_des', action='store_true', help='sorts not unique files by name (descending), may affect performance')
_parser.add_argument('--nice_newline', action='store_true', help='adds additional newline between groups of duplicates')


_args = _parser.parse_args()

def main():
	hashes = collections.defaultdict(list)
	
	for filename in filter(os.path.isfile, os.listdir(_args.path)):
		with open(filename, 'r+') as f:
			data = mmap.mmap(f.fileno(), 0)
			h = hashlib.new('sha1', data)
			hashes[h.hexdigest()].append(filename)

	for filenames in filter(lambda list: len(list) > 1, hashes.values()):
		if _args.sort_asc or _args.sort_des:
			filenames.sort(reverse=_args.sort_des)
	
		if _args.not_first:
			filenames = filenames[1:] # not first
			
		for filename in filenames:
			print(filename)
			
		if _args.nice_newline:
			print()

if __name__ == '__main__':
	main()

Przykładowe użycie:

python3 fdupes.py . --sort_asc
listuje duplikaty z obecnego folderu posortowane rosnąco dla każdej grupy duplikatów

python3 fdupes.py "C:/dane dzwiekowe" --not first
listuje duplikaty z folderu C:/dane dzwiekowe, jeśli jest np. 5 plików o takiej samej zawartości, to skrypt zwróci 4 nazwy plików (przydatne, jeśli chcielibyśmy zachować jeden plik, a resztę usunąć)

python3 fdupes.py . --nice_newline
listuje duplikaty z obecnego folderu, każdy grupa duplikatów jest oddzielona dodatkową pustą linią

Podobne pytania

0 głosów
2 odpowiedzi 51 wizyt
0 głosów
2 odpowiedzi 77 wizyt
pytanie zadane 30 maja 2017 w C i C++ przez Dominik Kulis Użytkownik (720 p.)
0 głosów
1 odpowiedź 117 wizyt
Porady nie od parady
Publikując kody źródłowe korzystaj ze specjalnego bloczku koloryzującego składnię (przycisk z napisem code w edytorze). Nie zapomnij o ustawieniu odpowiedniego języka z rozwijanego menu oraz czytelnym formatowaniu kodu.Przycisk code

60,308 zapytań

106,014 odpowiedzi

220,273 komentarzy

32,524 pasjonatów

Przeglądających: 158
Pasjonatów: 0 Gości: 158

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto dwie polecane książki warte uwagi. Pełną listę znajdziesz tutaj.

...