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

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

Я работаю на Linux Ubuntu 16 и мне нужно скопировать около 400 ГБ (около 100 000 файлов) данных с моего HDD на SSD. Этого я не могу сделать, потому что около 1000 из этих файлов имеют "слишком длинные имена", и я не могу просто пропустить их, так как их поиск займет много времени. Есть ли какая-нибудь программа, которая копирует файлы с длинными именами?

решение1

Оригинальный (неправильный) ответ

Крутые ребята сказали, что это rsyncработает как часы:

rsync -auv --exclude '.svn' --exclude '*.pyc' source destination

Оригинальный ответ:https://superuser.com/a/29437/483428

UPD: со сценарием

ок, другие крутые парни сказали, что rsyncэто не решение, когдасама файловая система не поддерживает длинные имена. Замечу, что rsyncэто не метафизический низкоуровневый суперсекретный инструмент, созданный богами (кстати, для Windows таких инструментов много;)

Итак, вот короткий скрипт на Python (насколько мне известно, Python 2.7 установлен по умолчанию в Ubuntu), который копирует все файлы из SRCв DSTи выводит имена файлов, вызвавших ошибки (включая длинные имена).

  1. Сохранить какcopy.py
  2. Использование:python copy.py SRC DEST
import os
import sys
import shutil

def error_on_dir(exc, dest_dir):
    print('Error when trying to create DIR:', dest_dir)
    print(exc)
    print()

def error_on_file(exc, src_path):
    print('Error when trying to copy FILE:', src_path)
    print(exc)
    print()

def copydir(source, dest, indent = 0):
    """Copy a directory structure overwriting existing files"""
    for root, dirs, files in os.walk(source):
        if not os.path.isdir(root):
            os.makedirs(root)
        for each_file in files:
            rel_path = root.replace(source, '').lstrip(os.sep)
            dest_dir = os.path.join(dest, rel_path)
            dest_path = os.path.join(dest_dir, each_file)

            try:
                os.makedirs(dest_dir)
            except OSError as exc:
                if 'file exists' not in str(exc).lower():
                    error_on_dir(exc, dest_dir)

            src_path = os.path.join(root, each_file)
            try:
                shutil.copyfile(src_path, dest_path)
            except Exception as exc:
                # here you could take an appropriate action
                # rename, or delete...
                # Currently, script PRINTS information about such files
                error_on_file(exc, src_path)


if __name__ == '__main__':
    arg = sys.argv
    if len(arg) != 3:
        print('USAGE: python copy.py SOURCE DESTINATION')
    copydir(arg[1], arg[2])

Связанный контент