• 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.

Object Storage Arubacloud
0 głosów
388 wizyt
pytanie zadane 6 lutego 2019 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 2019 przez Benek Szeryf (90,870 p.)
Cały czas pytasz o podobne rzeczy. Przysiadłbyś jeden wieczór i się nauczył podstawowej obsługi linii komend...
komentarz 6 lutego 2019 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 2019 przez Arkadiusz Sikorski Pasjonat (20,160 p.)
wybrane 7 lutego 2019 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 2019 przez Paweł Soszyński Początkujący (260 p.)
Rozwiązałem problem z pomocą AllDub 4.2 :)
1
komentarz 7 lutego 2019 przez Arkadiusz Sikorski Pasjonat (20,160 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 291 wizyt
0 głosów
1 odpowiedź 423 wizyt
0 głosów
2 odpowiedzi 308 wizyt
pytanie zadane 30 maja 2017 w C i C++ przez Dominik Kulis Użytkownik (720 p.)

92,553 zapytań

141,399 odpowiedzi

319,534 komentarzy

61,938 pasjonatów

Motyw:

Akcja Pajacyk

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

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...