ubuntuusers.de

Dateiname zu lang für cp und Dolphin

Status: Ungelöst | Ubuntu-Version: Kubuntu 17.10 (Artful Aardvark)
Antworten |

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 Team-Icon

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 Team-Icon

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:

1
2
3
4
5
6
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 Team-Icon

Supporter, Wikiteam
Avatar von kB

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 Team-Icon

Supporter, Wikiteam
Avatar von kB

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

Avatar von 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

1
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

Avatar von 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")
Antworten |