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

VPS Starter Arubacloud
0 głosów
366 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,690 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 281 wizyt
0 głosów
1 odpowiedź 418 wizyt
0 głosów
2 odpowiedzi 293 wizyt
pytanie zadane 30 maja 2017 w C i C++ przez Dominik Kulis Użytkownik (720 p.)

92,453 zapytań

141,262 odpowiedzi

319,088 komentarzy

61,854 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

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 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!

...