Нуждаюсь в помощи с копированием файла в командной строке

У меня есть эта папка, которая составляет огромных 700 ГБ, и некоторые из тех файлов являются дубликатом. У большого количества из них есть то же имя, некоторый дубликат, некоторые нет. В основном у меня есть приблизительно 30 папок в стороне что папка, заполненная файлами и большим количеством папок. Я хочу захватить все файлы в этой папке на 700 ГБ рекурсивно и скопировать ее нерекурсивно в другой каталог. Любые конфликты будут обработаны на основе размера. Если два файла имеют то же имя и являются тем же размером, файл пропускается, но, если два файла имеют то же имя и являются различными размерами, оба файла сохранены. Каким-либо путем я могу сделать это?

0
задан 15 June 2015 в 22:37

2 ответа

Сложный вопрос, так как простофили должны быть переименованы, но также и переименовали простофиль, должен быть проверен размером на все (возможно) ранее переименованные "товарищи".

Что это делает

Насколько я вижу (и протестированный), сценарий ниже делает это. Это переименовывает возможные дубликаты к [dupe_1]<file>, [dupe_1]<file> и т.д. (если они имеют другой размер), и проверки после каждого переименования, если размер файла соответствует или перемещенной простофиле или его переименованным версиям в целевом каталоге.

#!/usr/bin/env python3
import shutil
import os

#--- set the directory, the same as the first script
dr = "/path/to/recursive/source_directory"
dr2 = "/path/to/flat/target_directory"
#---

def check_dupe(src, trg):
    return os.stat(src).st_size == os.stat(trg).st_size

for root, dirs, files in os.walk(dr):
    for file in files:
        # define src, target
        src = root+"/"+file; trg = dr2+"/"+file
        if not os.path.exists(trg):
            # if target does not exist: move file
            shutil.copy(src, trg)
        else:
            n = 1
            # rename the file, check after every renaming if file exists, if size differs
            while os.path.exists(trg):
                test = check_dupe(src, trg)
                if test != True:
                    trg = dr2+"/[dupe_"+str(n)+"]"+file
                    n += 1
                else:
                    break
            if test != True:
                shutil.copy(src, trg)

Как использовать

  1. Скопируйте сценарий в пустой файл, сохраните его как reorganize.py
  2. В главном разделе сценария, установленного пути к входному и выходному каталогу
  3. Выполните его командой:

    python3 /path/to/reorganize.py
    

Примечания

  • Протестируйте на небольшой выборке сначала
  • Следует иметь в виду, что это возможно создаст огромный "плоский" каталог, который не будет доступен для просмотра наутилусом.
1
ответ дан 4 October 2019 в 03:20

попробуйте это:

cd [folder_name]
for file in ./*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*
do
    if [ -e [destination_folder]/"$file" ]; then
        if [ `du -s "$file" | cut -d ' ' -f 1` -eq `du -s [destination_folder]/"$file" | cut -d ' ' -f 1` ]; then
            false
        else
            cp "$file" [destination_folder]/"$file"...
        fi
    else
        cp "$file" [destination_folder]/
    fi
    echo "$file copied"
done
1
ответ дан 4 October 2019 в 03:20

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

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