Ich verwende Linux Ubuntu 16 und muss etwa 400 GB (etwa 100.000 Dateien) Daten von meiner Festplatte auf meine SSD kopieren. Das geht nicht, weil etwa 1000 dieser Dateien „zu lange Namen“ haben und ich sie nicht einfach überspringen kann, da es sehr lange dauern würde, sie zu finden. Gibt es ein Programm, das Dateien mit langen Namen kopiert?
Antwort1
Ursprüngliche (falsche) Antwort
Coole Jungs haben erzählt, das rsync
klappt super:
rsync -auv --exclude '.svn' --exclude '*.pyc' source destination
Ursprüngliche Antwort:https://superuser.com/a/29437/483428
UPD: mit Skript
ok, andere coole Jungs sagten, das rsync
ist keine Lösung, wennDas Dateisystem selbst unterstützt keine langen Namen. Ich nehme zur Kenntnis, dass rsync
es sich hier nicht um ein metaphysisches, von Göttern erschaffenes, supergeheimes Low-Level-Tool handelt (übrigens gibt es eine Menge solcher Tools für Windows ;)
Hier ist also ein kurzes Python-Skript (Python 2.7 ist standardmäßig auf Ubuntu installiert, soweit ich weiß), das alle Dateien von SRC
nach kopiert DST
und die Namen der Dateien druckt, die Fehler verursacht haben (einschließlich langer Namen).
- Speichern unter
copy.py
- Verwendung:
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])