
4개의 하드 디스크가 있고 이 4개의 하드 디스크(하위 디렉터리 포함)에서 어떤 파일이 중복되는지 확인하고 싶습니다. 하드 디스크 내에서뿐만 아니라 다른 모든 디스크에 대해서도 검사해야 합니다.
하드 디스크는 대용량(3TB)이므로 효율적이어야 합니다(체크섬 검사보다 첫 번째 파일 이름 정도).
답변1
아래 스크립트는 한 번에 최대 10개 디렉터리에서 중복 파일을 찾습니다.결합된디렉토리.
fdupes
(running fdupes -r
) fslint
및 ; 로컬에 저장된 40GB의 비교적 작은 디렉토리에서 스크립트가 복제 목록을 생성하는 데 5초가 걸렸지만 훨씬 더 오래 걸렸습니다 fdupes
( fslint
~ 90/100초). 상대적으로 느린 외부 USB 드라이브의 더 큰 디렉터리(700GB, ~350,000개 파일)에서는 90분이 걸렸습니다. fdupes를 사용하면 진행률 표시를 보면 200~250분 이상이 걸렸을 것입니다(좋은 점은 아래 스크립트에 진행률이 표시되지 않음). 하지만 끝까지 기다리지는 않았습니다.
예를 들어 fslint
스크립트는 (있는 그대로) 제공하지 않는 추가 기능을 제공하므로 비교는 엄격하게 속이는 목록 생성에 관한 것입니다.
더욱이 속도는 디스크가 얼마나 빨리 읽는지에 따라 부분적으로 달라집니다. 특히 파일 목록을 만드는 것이 작업에서 상대적으로 큰 부분을 차지하는 작은 디렉터리에서 큰 차이가 있는 여러 미디어(네트워크 드라이브의 ao)를 테스트했습니다(' 시간).
결론은 어느 쪽이든 빠른 작업이 아니라는 것입니다. 디렉토리가 너무 크지 않은지 스스로에게 물어볼 수 있습니다.
작동 원리
스크립트가 중복 항목을 찾으면 중복 항목이 다음과 같이 나열됩니다.
Creating file list... /home/jacob/Bureaublad/test2
Creating file list... /home/jacob/Bureaublad/foto
Creating file list... /home/jacob/Bureaublad/Askubuntu
Checking for duplicates (10790 files)...
------------------------------------------------------------
> found duplicate: test1.txt 2
/home/jacob/Bureaublad/test2/test1.txt
/home/jacob/Bureaublad/test2/another directory/test1.txt
------------------------------------------------------------
등등
스크립트
#!/usr/bin/env python3
import os
import sys
total_filelist = []
total_names = []
def find_files(directory):
l = []; l2 = []
for root, dirs, files in os.walk(directory):
for file in files:
l.append(file)
l2.append(root+"/"+file)
return (l, l2)
i = 1
while i <= 10:
try:
dr = (sys.argv[i])
print("Creating file list...", dr)
total_filelist = total_filelist+find_files(dr)[1]
total_names = total_names+find_files(dr)[0]
i = i+1
except IndexError:
break
print("Checking for duplicates ("+str(len(total_names)),"files)...")
for name in set(total_names):
n = total_names.count(name)
if n > 1:
print("-"*60,"\n> found duplicate:",
name, n, "\n")
for item in total_filelist:
if item.endswith("/"+name):
print(item)
print("-"*60, "\n")
빈 파일에 복사하고 다른 이름으로 저장한 후 find_dupes.py
다음 명령으로 실행하세요.
python3 <script> <directory1> <directory2> <directory3>
최대 10개의 디렉터리
스크립트의 추가 옵션
추가 기능을 추가하는 것은 비교적 간단합니다. 예를 들어 이름 바꾸기 등의 중복 항목을 다른 디렉토리로 이동하면 유지할 파일을 수동 또는 자동으로 결정할 수 있습니다.
일을 가능하게 만드는 방법
귀하의 디렉토리가 거대해 보입니다. 작업을 합리적으로 가능하게 하려면 시스템이 "막히는" 것을 방지하는 또 다른 더 정교한 방법이 있습니다. 모든 파일 형식(확장자)에 대해 동시에 작업을 수행하는 대신 작업을 여러 부분으로 잘라낼 수 있습니다.파일 유형별 섹션. 30,000개 파일 디렉터리에 대한 소규모 테스트를 통해 앱 설치 시간이 단축되었습니다. 하나의 확장자에 대해 20초(모든 파일) ~ 0.3초입니다.
스크립트가 한 가지 파일 형식의 중복 항목만 찾도록 하려면 스크립트 섹션을 바꾸세요.
def find_files(directory):
l = []; l2 = []
for root, dirs, files in os.walk(directory):
for file in files:
l.append(file)
l2.append(root+"/"+file)
return (l, l2)
에 의해:
def find_files(directory):
l = []; l2 = []
for root, dirs, files in os.walk(directory):
for file in files:
if file.endswith(".py"): # example .py extension
l.append(file)
l2.append(root+"/"+file)
return (l, l2)
발생하는 파일 확장자 찾기
디렉토리에서 발생하는 모든 파일 확장자를 나열하려면 아래 스크립트를 사용할 수 있습니다.
#!/usr/bin/env python3
import sys
import os
l = []
for root, dirs, files in os.walk(sys.argv[1]):
for f in files:
if (
f.startswith("."),
f.count(".") == 0,
f.endswith("~"),
) == (False, False, False):
l.append(f[f.rfind("."):])
for item in set(l):
print(item)
빈 파일에 복사하고 다른 이름으로 저장한 후 find_extensions.py
다음 명령으로 실행하세요.
python3 <script> <diretory>
출력 예:
.txt
.mp3
.odt
.py
.desktop
.sh
.ods
답변2
매우 유능한 GUI를 사용하려면 소프트웨어 센터에서 FSlint를 사용해 보세요.
(위의 댓글에서 @lemonsqueeze가 이를 제안한 것을 확인했습니다.)
다음은 Fslint 사용법을 간략하게 설명하는 답변입니다. https://askubuntu.com/a/472244/100356
답변3
나는 FSlint 프로젝트를 사용하여 작업을 완료했습니다.
CLI 및 화면을 통해 모든 것을 실행해야 한다는 요구 사항을 사용하여 이 모든 것을 여러 디스크에 정리하는 프로세스
sudo apt-get install fslint
find path1/2/3 -type f -empty -delete
&find path1/2/3 -type d -empty -delete
(비어 있거나 완전히 복사되지 않은 내용을 제거하기 위해)/usr/share/fslint/fslint/findsn path1 path2 path3
(다른 디스크에서 동일한 크기로 동일한 디렉터리에 저장된 모든 항목을 삭제합니다.)/usr/share/fslint/fslint/findup path1 path2 path3
(중복 파일 모두 삭제)find path1/2/3 -type d -empty -delete
(찾기 후 비어 있는 디렉토리를 제거하기 위해)
mhddfs
그 후 중복 디스크 공간을 다시 낭비하지 않고 모든 디스크를 결합된 드라이브로 다시 마운트할 수 있었습니다.