Kteino
Anmeldungsdatum: 1. Juni 2017
Beiträge: 87
|
cp -r /$QUELLE ~$ZIEL zeigt mir schon bei 201 Zeichen an, dass der Dateiname zu lang sei, gleicher Fehler in Dolphin. $QUELLE ist auf einer NTFS/FAT32-Partition und $ZIEL ist ext4. Laut Wikipedia unterstützt ext4 Dateinamen bis zu einer Länge von 255 Zeichen. Wie kann ich die Dateien dennoch kopieren?
|
ChickenLipsRfun2eat
Anmeldungsdatum: 6. Dezember 2009
Beiträge: 12067
|
Hallo! Ich habe keine Dateien mit solch langen Namen im System, ist aber ein interessantes Problem ☺ Ich würde folgendes versuchen:
find -type f -iname "AnfangDesLangenDateiNamens*" -exec cp {} Zielordner/ \; rsync für nen komplettes Verzeichnis Für eine größere Verzeichnisstruktur: Hauptordner packen und im Ziel extrahieren (tar, 7z, etc.)
|
seahawk1986
Anmeldungsdatum: 27. Oktober 2006
Beiträge: 11243
Wohnort: München
|
Kteino schrieb: cp -r /$QUELLE ~$ZIEL zeigt mir schon bei 201 Zeichen an, dass der Dateiname zu lang sei [...] Laut Wikipedia unterstützt ext4 Dateinamen bis zu einer Länge von 255 Zeichen.
Hast du den Pfad bis in dein Benutzerverzeichnis dazu gezählt? Man könnte als Workaround ein Verzeichnis nutzen, das näher an / ist und es per mount-bind ins Benutzerverzeichnis einbinden.
|
ChickenLipsRfun2eat
Anmeldungsdatum: 6. Dezember 2009
Beiträge: 12067
|
Der Pfad fällt sicher nicht unter die Beschränkung. Ich kann problemlos Pfade → 255 Zeichen in der Konsole mit cp kopieren: | dms@usrv:[~$]> ll "/home/dms/sam/Medien/Musik/H/Hörbücher/Margaret Weis, Tracy Hickman - Die Chronik der Drachenlanze/Margaret Weis, Tracy Hickman - Die Chronik der Drachenlanze 1 (1989)/Margaret Weis, Tracy Hickman - Die Chronik der Drachenlanze 1 - 88 - Drachenzwielicht.mp3"
-r--r--r-- 1 www-data ckgrp 6745341 Jul 8 2010 /home/dms/sam/Medien/Musik/H/Hörbücher/Margaret Weis, Tracy Hickman - Die Chronik der Drachenlanze/Margaret Weis, Tracy Hickman - Die Chronik der Drachenlanze 1 (1989)/Margaret Weis, Tracy Hickman - Die Chronik der Drachenlanze 1 - 88 - Drachenzwielicht.mp3
dms@usrv:[~$]> echo "/home/dms/sam/Medien/Musik/H/Hörbücher/Margaret Weis, Tracy Hickman - Die Chronik der Drachenlanze/Margaret Weis, Tracy Hickman - Die Chronik der Drachenlanze 1 (1989)/Margaret Weis, Tracy Hickman - Die Chronik der Drachenlanze 1 - 88 - Drachenzwielicht.mp3" | wc -m
258
dms@usrv:[~$]> cp "/home/dms/sam/Medien/Musik/H/Hörbücher/Margaret Weis, Tracy Hickman - Die Chronik der Drachenlanze/Margaret Weis, Tracy Hickman - Die Chronik der Drachenlanze 1 (1989)/Margaret Weis, Tracy Hickman - Die Chronik der Drachenlanze 1 - 88 - Drachenzwielicht.mp3" .
dms@usrv:[~$]>
|
Nachtrag: !#code bash
∞|schiggn@x220arch[~]› echo "/home/schiggn/Sammelmappe/Medien/Musik/H/Hörbücher/Margaret\ Weis\,\ Tracy\ Hickman\ -\ Die\ Chronik\ der\ Drachenlanze/Margaret\ Weis\,\ Tracy\ Hickman\ -\ Die\ Chronik\ der\ Drachenlanze\ 1\ \(1989\)/Margaret\ Weis\,\ Tracy\ Hickman\ -\ Die\ Chronik\ der\ Drachenlanze\ 1\ -\ 88\ -\ Drachenzwielicht.mp3" | wc -m
306
∞|schiggn@x220arch[~]› ist lokal (per sshfs eingebunden) sogar noch länger mit Pfad und lässt sich mit Dolphin problemlos kopieren, etc.
|
kB
Supporter, Wikiteam
Anmeldungsdatum: 4. Oktober 2007
Beiträge: 9615
Wohnort: Münster
|
Kteino schrieb: […] Laut Wikipedia unterstützt ext4 Dateinamen bis zu einer Länge von 255 Zeichen.
255 Zeichen ist falsch! Richtig: Das Dateisystem ext4 unterstützt Dateinamen mit bis zu 255 Byte. Ein Zeichen kann aber mehr als ein Byte benötigen.
Wie kann ich die Dateien dennoch kopieren?
Dateien mit zu langem Namen vor dem kopieren umbenennen. Dabei Zeichen vermeiden, die mehr als ein Byte zur Darstellung in UTF-8 benötigen. Dies betrifft auch „äöüßÄÖÜ“.
|
Kteino
(Themenstarter)
Anmeldungsdatum: 1. Juni 2017
Beiträge: 87
|
seahawk1986 schrieb: Kteino schrieb: cp -r /$QUELLE ~$ZIEL zeigt mir schon bei 201 Zeichen an, dass der Dateiname zu lang sei [...] Laut Wikipedia unterstützt ext4 Dateinamen bis zu einer Länge von 255 Zeichen.
Hast du den Pfad bis in dein Benutzerverzeichnis dazu gezählt?
Ja. kB schrieb: Kteino schrieb: […] Laut Wikipedia unterstützt ext4 Dateinamen bis zu einer Länge von 255 Zeichen.
255 Zeichen ist falsch! Richtig: Das Dateisystem ext4 unterstützt Dateinamen mit bis zu 255 Byte. Ein Zeichen kann aber mehr als ein Byte benötigen.
Wie kann ich die Dateien dennoch kopieren?
Dateien mit zu langem Namen vor dem kopieren umbenennen. Dabei Zeichen vermeiden, die mehr als ein Byte zur Darstellung in UTF-8 benötigen. Dies betrifft auch „äöüßÄÖÜ“.
An nicht-alphanumerischen Zeichen kommen nur Leerzeichen, Punkte, Unterstriche und Klammern vor. Gibt es eine Möglichkeit, unter Linux die Dateinamen auf 255 Byte zu bringen (es sind über 1000 Dateien, also Batch-Betrieb)?
|
kB
Supporter, Wikiteam
Anmeldungsdatum: 4. Oktober 2007
Beiträge: 9615
Wohnort: Münster
|
Kteino schrieb: […] $QUELLE ist auf einer NTFS/FAT32-Partition und $ZIEL ist ext4.
Zeige mal ein konkretes Beispiel eines problematischen Dateinamens (inkl. Pfad) als Hexdump, z.B. so: klaus@gnome25:~$ ls /etc/passwd | hd
00000000 2f 65 74 63 2f 70 61 73 73 77 64 0a |/etc/passwd.|
0000000c (Ersetze "/etc/passwd" durch Deinen Dateinamen!) Zeige: echo $QUELLE | hd
echo $ZIEL | hd Bedenke auch, dass bei cp -r auch die Länge des Namens jeder im Quellorder gefundenen Datei noch zur Gesamtlänge des Dateinamens hinzukommt. Bedenke auch: NTFS/FAT hat andere Restriktionen hinsichtlich Dateinamen als ext4.
|
elektronenblitz63
Anmeldungsdatum: 16. Januar 2007
Beiträge: 29307
Wohnort: NRW
|
Hallo, wäre nicht rsync mit Konvertierungsoption (--iconv und --backup-dir=Verzeichnis) eine Möglichkeit die Dateien zu kopieren und gleichzeitig den Dateinamen passend zu konvertieren?
|
Kteino
(Themenstarter)
Anmeldungsdatum: 1. Juni 2017
Beiträge: 87
|
Dann probiere ich mal | rsync -a --iconv=iso88591 --progress $QUELLE $ZIEL
|
Soll ich bei --iconv iso88591 oder utf8 oder etwas anderes angeben? Eine Datei, die nicht klappt, ist
1
2
3
4
5
6
7
8
9
10
11
12
13
14 | 00000000 |/media/userler/T|
00000010 4f 53 48 49 42 41 20 45 58 54 2f 4d 61 74 68 65 |OSHIBA EXT/Mathe|
00000020 6d 61 74 69 6b 2f 75 6e 73 6f 72 74 69 65 72 74 |matik/unsortiert|
00000030 2f 46 61 6e 74 65 63 68 20 42 2e 2c 20 47 6f 74 |/Fantech B., Got|
00000040 74 73 63 68 65 20 4c 2e 2c 20 49 6c 6c 75 73 69 |tsche L., Illusi|
00000050 65 20 4c 2e 2c 20 65 74 20 61 6c 2e 20 46 75 6e |e L., et al. Fun|
00000060 64 61 6d 65 6e 74 61 6c 20 41 6c 67 65 62 72 61 |damental Algebra|
00000070 69 63 20 47 65 6f 6d 65 74 72 79 2e 20 47 72 6f |ic Geometry. Gro|
00000080 74 68 65 6e 64 69 65 63 6b 27 73 20 46 47 41 20 |thendieck's FGA |
00000090 45 78 70 6c 61 69 6e 65 64 20 28 41 4d 53 2c 20 |Explained (AMS, |
000000a0 32 30 30 35 29 28 36 30 30 64 70 69 29 28 4b 41 |2005)(600dpi)(KA|
000000b0 29 28 54 29 28 33 35 32 73 29 5f 4d 41 67 5f 2e |)(T)(352s)_MAg_.|
000000c0 64 6a 76 75 0a |djvu.|
000000c5
|
Hex c5 ist kleiner als 255.
|
elektronenblitz63
Anmeldungsdatum: 16. Januar 2007
Beiträge: 29307
Wohnort: NRW
|
Kteino schrieb: Soll ich bei --iconv iso88591 oder utf8 oder etwas anderes angeben?
Ziel = ext4 → also Linux → IMHO utf8 Das rsync nur so eine Idee, ob das fehlerfrei funktioniert kann ich dir nicht sagen. Musst Du mal testen, und schauen wo es ggf. hakt. Hier wird das auch zum Datenabgleich zwischen Windows und Linux genutzt, allerdings nicht direkt von mir selbst, die Dateinamen sind auch nicht so lang und auf Sonderzeichen/Umlaute wird schon bei der Erstellung der Dateien geachtet. Eine weitere Möglichkeit zur Umbenennung mit Vorabprüfung der Namen die ich kenne, wäre u.a. auch pyRenamer. Siehe auch Sonstige Software (Abschnitt „Dateimanagement“)
|
Kteino
(Themenstarter)
Anmeldungsdatum: 1. Juni 2017
Beiträge: 87
|
Mit utf8 funktioniert es nicht. Ich habe mal pyRenamer versucht:
{X}({X}).djvu
{1}.djvu
funktioniert nicht (Quelle → Ziel): Die Klammern bleiben. Edit: Ich glaube, ich schreibe mir ein eigenes Python-Skript. Edit 2: Hier ist es:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 | import os
path = "E:\\"
files = [os.path.join(dp, f) for dp, dn, fn in os.walk(os.path.expanduser(path)) for f in fn]
nFilesRenamed = 0
nFilesAlreadyExist = 0
for fname in files:
begin = fname.find('(')
end = fname.rfind('.')
newname = fname[0:begin] + fname[end:]
if not os.path.isfile(newname):
print("rename: " + fname + " to " + newname)
os.rename(fname, newname)
nFilesRenamed += 1
else:
print("Datei " + newname + "schon vorhanden!")
nFilesAlreadyExist += 1
print(str(nFilesRenamed) + " Dateien umbenannt")
print(str(nFilesAlreadyExist) + "Dateien existierten schon")
|
|