Я работаю на 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
и выводит имена файлов, вызвавших ошибки (включая длинные имена).
- Сохранить как
copy.py
- Использование:
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])