• 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
Wynikowy wygląd pytania, odpowiedzi czy komentarza, różni się od tego zaprezentowanego w edytorze postów. Stosuj więc funkcję Podgląd posta znajdującą się pod edytorem, aby upewnić się, czy na pewno ostateczny rezultat ci odpowiada.Podgląd posta

60,308 zapytań

106,014 odpowiedzi

220,273 komentarzy

32,524 pasjonatów

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

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.

...