Монтирование SSD с использованием адаптера PCIe

Скрипт ниже ищет дубликаты файлов в до 10 каталогов одновременно, ищет дубликаты в комбинированных каталогах.

Он должен быть значительно быстрее, чем fdupes (работает fdupes -r) и fslint; на сравнительно небольшом каталоге в 40 ГБ, локально сохраненном, для создания списка дубликатов потребовалось 5 секунд, а для fdupes и fslint потребовалось намного больше (~ 90/100 секунд). В более крупном каталоге (700 ГБ, ~ 350000 файлов) на относительно медленном внешнем USB-накопителе это заняло 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 каталогов

Дополнительные параметры скрипта

It относительно просто добавить дополнительные функции; переместить дубликаты в другой каталог, например, переименовать и т. д., чтобы вы могли вручную или автоматически решить, какой файл сохранить.

Как сделать работу выполнимой

Ваши каталоги кажутся огромными. Чтобы сделать работу разумно возможной, существует еще один, более сложный способ предотвратить «удушье» системы: вместо выполнения задания на всех типах файлов (расширений) сразу вы можете сократить задание на в сочетании . Небольшой тест в каталоге из 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)

by:

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
1
задан 20 July 2017 в 07:14

0 ответов

Другие вопросы по тегам:

Похожие вопросы: