Zu lange Datei- /Ordnernamen?

Status
Für weitere Antworten geschlossen.

Questman

Benutzer
Mitglied seit
26. Okt 2017
Beiträge
15
Punkte für Reaktionen
0
Punkte
7
Hallo,

und wieder ein glücklicher neuer Synology Besitzer :)

Ich habe ein kleines aber evtl. entscheidendes Problem:

Ich bin dabei bzw. möchte diverse gemeinsame Ordner verschlüsseln. Bis auf einen klappt das ja auch ganz gut... Dort bekomme ich allerdings die "Fehler-"Meldung das der Datei-/Ordnername zu lang sei. Es ist mir klar, das bei verschlüsselten Ordnern "nur" 143 Zeichen erlaubt sind. Ich wusste aber nicht das ich wohl Dateien/Ordner habe die (bescheuerterweise...) entsprechend lang benannt sind. Warum und von wem auch immer...Ist jedenfalls so oder so nicht gut und soll nicht sein!

Umbenennen wäre ja kein Problem wenn ich wüsste welche(r) Datei/Ordner wo in dem Gemeinsamen Ordner betroffen ist. Über 10GB an Daten (um die 100Tsd Dateien in tausenden Pfaden) manuell zu durchsuchen....Keine Chance!

Gibt es evtl. eine Funktion, ein Tool oder ähnliches mit dem ich nach entsprechenden Dateien/Ordnern suchen kann?

Grüße aus Bremen Kai-Uwe
 

AndiHeitzer

Benutzer
Sehr erfahren
Mitglied seit
30. Jun 2015
Beiträge
3.341
Punkte für Reaktionen
633
Punkte
174
Ja, sowas ist allerdings blöde ...

Nur mal so als Schnaps-Idee.
Ein komplettes Listing aller Files (DIR/LS/...) in ein Textfile ausgeben.
Danach im Textfile einfach den längsten Eintrag raus suchen.

Das Ganze würde ich per Script lösen, habe sowas aber nicht wirklich parat. Aber so als Denkansatz?
 

Questman

Benutzer
Mitglied seit
26. Okt 2017
Beiträge
15
Punkte für Reaktionen
0
Punkte
7
Hi,

Danke erstmal für die schnelle Antwort. Scripting - Das ist für mich fast noch schlimmer als die Geschirrspülmaschine ausräumen zu müssen :) Das kann ich leider überhaupt nicht. Zudem würde das bei der Dateien-/Ordnermenge funktionieren?

Ich denke ich kann doch auch nicht der Einzige mit diesem Problem sein? Evtl. wurde das ja schon einmal gelöst. Das andere User entsprechende Probleme haben,, das habe ich im Netz festgestellt. Jedoch noch keine vernünftige Lösung gefunden. Außer einem Tool für ca. 70.-€ welches man nicht einmal testen kann. Und 70.-€ für einen Durchlauf........? Ich zahle ja gerne für Leistung aber das war mir dann dafür zu teuer zumal, ohne Funktionsgarantie.

Grüße Kai-Uwe
 

Tommi2day

Benutzer
Mitglied seit
24. Aug 2011
Beiträge
1.192
Punkte für Reaktionen
73
Punkte
68
Naja, das kann schon ein Einzeiler auf der Kommandozeile. Der zeigt alles an, was >143 Zeichen lang ist , genauer er blendet alles aus, was weniger als 144 Zeichenlang ist
find /volume* |perl -p -e 'if (length($_)<144) {$_="";}'
 

Questman

Benutzer
Mitglied seit
26. Okt 2017
Beiträge
15
Punkte für Reaktionen
0
Punkte
7
Hi Tommi2day!

Könntest du (oder auch gerne jemand Anders) das evtl. Etwas genauer für ?nen doofen erklären?

Ok, gebe das auf der Komandozeile am Rechner ein. Dann wird aber doch nicht das NAS sondern der Rechner entsprechend durchsucht „. Das wäre soweit OK, weil die Pfade etc. ja zwischen Rechner und NAS synchronisiert werden und das Problem ja auch vom Rechner aus ausgeht. Wenn ich also weiß welche Datei/Ordner auf dem Rechner, wo betroffen ist kann ich die entsprechend ändern und durch den Sync ist das dann auf dem NAS identisch (Cloud Station läuft ja). Ist soweit alles OK läuft das auch mit der Verschlüsselung. Super! Soweit kapiert! Danke! Aber.....

Bevor ich damit loslege und evtl. mehr schief als richtig läuft: Ist Volume* nicht eine Variable? Muss ich das durch zB. c: oder so ersetzen?
Und dann steht da Perl.....Ist Perl nicht eine Programmiersprache? Habe ich die überhaupt? Wohl eher nicht. :) Ich habe hier nur Windows am laufen. Genauer Windows 10 Pro (Fall Creators Update).

Du siehst ich habe da noch die eine oder andere (größere) Wissenslücke. Aber darum bin ich ja hier.

Grüße Kai-Uwe
 

Tommi2day

Benutzer
Mitglied seit
24. Aug 2011
Beiträge
1.192
Punkte für Reaktionen
73
Punkte
68
Hallo Kay-Uwe,

Das sind Unix-Befehle, die für die Kommandozeile auf der DS gedacht waren. Also zuerst in Systemsteuerung/Terminal ssh erlauben und dann von einem Windows-PC aus z.B. mit Putty und dem Admin-User auf der DS anmelden.
"find" erstelt ein Dateilisting aller Dateien ab dem angegebenen Verzeichnis. "/volume*" bedeutet, das er in allen Volumes auf der DS sucht (/volume1, /volume2 ..usw falls vorhanden). Als Ergebnis wird der volle Pfad jeder Datei ausgegeben. Das wird mit dem Pipe Zeichen Zeile für Zeile einem Perlscript übergeben, welches Dateinamen <144 Zeichen entfernt, der Rest wird ausgegeben. Perl sollte auf der DS drauf sein, wenn nicht gibt es ein auch ein Paket dafür im Paketzentrum.

HTH
 

Questman

Benutzer
Mitglied seit
26. Okt 2017
Beiträge
15
Punkte für Reaktionen
0
Punkte
7
Wow!

Danke für die schnelle und super gute, toll zu verstehende Antwort! Jetzt ist es richtig doof, das ich dieses Wochenende nicht zu Hause bin! Das hab ich soweit kapiert, leuchtet ein und ich habe was zum spielen/lernen!

Ich werd das gleich nach dem langen Wochenende mal in Ruhe probieren und dann hier Feedback geben. Scheiss Wetter aber was gelernt! Danke!

Grüße Kai-Uwe
 

Fusion

Benutzer
Sehr erfahren
Mitglied seit
06. Apr 2013
Beiträge
14.165
Punkte für Reaktionen
916
Punkte
424
@Tommi2day - das ist aber die falsche Begrenzung. Die Länge von Datei- und Ordnernamen ist wichtig, nicht die Länge des gesamten Pfades.
 

Tommi2day

Benutzer
Mitglied seit
24. Aug 2011
Beiträge
1.192
Punkte für Reaktionen
73
Punkte
68
Das heist die Begrenzug gilt erst ab dem Share? Dann könnte man um das Prinzip weiter zu verwenden mit "cd /volume*/<share> " in das zu betrachtende Share einsteigen und für den Find dann "find ." statt "find /volume* verwenden und das Limit auf 146 wegen dem dann vorangestelleten "./" erhöhen . Oder was immer auch notwendig ist um den richtigen Startpunkt für das Listing zu finden.
 

Questman

Benutzer
Mitglied seit
26. Okt 2017
Beiträge
15
Punkte für Reaktionen
0
Punkte
7
Hi.

keine Ahnung ob das Script den kompletten Pfad oder nur die Datei-/Ordnernamen auswertet. Benötigt werden aber nur die Datei-/Ordnernamen. Die Länge des Pfades spielt laut Synology keine Rolle. Da hat Fusion recht. Testen kann ich es derzeit wie gesagt ja nicht.

Der „Einstieg“ wäre also nicht das Share sonder immer das Ende des Pfades. Das sind tausende von unterschiedlichen Pfaden auf dem Share.........

Es muss geprüft werden ob ein reiner Ordnername ohne Pfad mehr als 143 Zeichen hat und ob es Dateinamen, ohne Pfad aber incl. der Endung, gibt die mehr als 143 Zeichen haben. Und man muss dann eben wissen welcher Ordner bzw. welche Datei das ist um die entsprechen umbenennen zu können.

Das NAS prüft das vor Beginn der Verschlüsselung, sagt aber leider nicht wo die Längenbegrenzung überschritten wird. Nur das sie überschritten wird. Schade eigentlich.....

Grüße Kai-Uwe
 
Zuletzt bearbeitet:

Fusion

Benutzer
Sehr erfahren
Mitglied seit
06. Apr 2013
Beiträge
14.165
Punkte für Reaktionen
916
Punkte
424
Nein, nach meiner Erfahrung gilt die Begrenzung explizit nur PRO Ordner- und Dateiname.
Ist jedenfalls meine Erfahrung, da bei mir abertausende Pfade länger als 143 Zeichen sind (GemeinsamerOrdner/Unterordner/Unterordner.../Datei)
Keiner der Einzelbestandteile darf die 143 überschreiten.
Wie lange der Pfad insgesamt sein darf habe ich nicht getestet
 

Questman

Benutzer
Mitglied seit
26. Okt 2017
Beiträge
15
Punkte für Reaktionen
0
Punkte
7
@Fusion

Genau! Und irgendwo in meinen tausenden Ordnern/Dateien gibt es mindestens einen der zu lang (>143 Zeichen) benannt ist. Den/die gilt es zu finden.

Grüße Kai-Uwe
 

Tommi2day

Benutzer
Mitglied seit
24. Aug 2011
Beiträge
1.192
Punkte für Reaktionen
73
Punkte
68
Gut, dann muss man jeden Teil einzeln betrachten. Auch das kann Perl ganz gut. Man erstellt zunächst ein kleines Script z.B. check_len.pl
Rich (BBCode):
$z="";
$max=143;
foreach $p (split (/\//i,$_)) {
        $l=length($p);
        if ($l >$max){
                $z="$_";
                break;
        }
}
$_="";
print "$l::$z" if ($l>$max);

Damit wird der Path in seine Bestandteile zerlegt, auf jeden Teil die Längenprüfung angewendet und wenn er was findet als erstes die Länge und dann den vollen Pfad angewendet.

Dann wieder wie schon beschrieben den Find benutzen, dieses mal
Rich (BBCode):
find /volume* |perl -p check_len.pl

Ergebnis sieht dann z.B. so aus
146::/volume1/public/bigdata/@eaDir/An Introduction to the Berkeley Data Analytics Stack _BDAS_ Featuring Spark, Spark Streaming, and Shark - Part 1 Presentation 3.pptx@SynoEAStream

Für die Puristen: Ja , Perl hat selber ein Find Modul, die Shell version ist aber einfacher
 

Questman

Benutzer
Mitglied seit
26. Okt 2017
Beiträge
15
Punkte für Reaktionen
0
Punkte
7
Hi,

ähhh? Ja?... Sorry, aber jetzt bin ich wohl raus.....
Geht es auch einfacher? Sagen wir mal so für den Otto-Normal-User auf OSI-Schicht 8. So „Klick“ „Klick“ und fertig?

Wäre es nicht am einfachsten schon auf der Platte am Rechner auf die 143 Zeichen zu prüfen? Beim umbenennen wird das dann doch auf das NAS via Cloud Station Drive gesynct und das Problem damit automatisch behoben.........?

Ich hätte aber auch nicht gedacht das mir hier so intensiv versucht wird zu helfen! Danke!

Grüße Kai-Uwe
 

Tommi2day

Benutzer
Mitglied seit
24. Aug 2011
Beiträge
1.192
Punkte für Reaktionen
73
Punkte
68
Man kann das sicherlich auch auf Windows und mit Powershell oder VBS machen, nur da bin ich raus.
 

Questman

Benutzer
Mitglied seit
26. Okt 2017
Beiträge
15
Punkte für Reaktionen
0
Punkte
7
So, Lösung! :)

Ich, als "Nichtcoder" habe meinen Sohn mal drangesetzt. Macht gerade eine Ausbildung zum FIAE. Er hat ein kleines Script geschrieben welches sich unter Windows ausführen lässt und die entsprechenden Ordner/Dateien ausgibt. Dazu benötigt man allerdings noch PHP. Das ist aber ja kein großes Problem.

Es hat super geklappt und das NAS hat nun alles brav verschlüsselt. Einfach den zu langen Namen am PC geändert. Das wurde dann ja sofort zum NAS gesynct und fertig. :)

Hier mal das Script, welches ihr frei verwenden dürft. Einfach abtippen/kopieren und mit einem frei wählbaren Dateinamen und der Endung .php speichern.

<?php
/**
* Created by PhpStorm.
* User: janja
* Date: 02.11.2017
* Time: 16:43
*/

$directory = "C:/Users/kaiuw/Music"; //Hier muss der zu durchsuchende Pfad stehen. Keine Backslashes!
$fileLength = 143; //Hier muss die maximal erlaubte Länge des Ordner-/Dateinamens stehen.


function getDirContents($dir, &$results = array()){
$files = scandir($dir);

foreach($files as $key => $value){
$path = realpath($dir.DIRECTORY_SEPARATOR.$value);
if(!is_dir($path)) {
$results[] = $path;
} else if($value != "." && $value != "..") {
getDirContents($path, $results);
$results[] = $path;
}
}

return $results;
}

$dirArray = getDirContents($directory);

foreach ($dirArray as $file) {
if (strlen(basename($file)) > $fileLength)
echo $file . "\r\n";
}

Grüße Kai-Uwe
 
Status
Für weitere Antworten geschlossen.
 

Kaffeautomat

Wenn du das Forum hilfreich findest oder uns unterstützen möchtest, dann gib uns doch einfach einen Kaffee aus.

Als Dankeschön schalten wir deinen Account werbefrei.

:coffee:

Hier gehts zum Kaffeeautomat