case-insensitives Kopieren von Dateien

Alles rund um die verschiedenen Konsolen und shells sowie die Programmierung unter Linux

Moderator: Moderatoren

Antworten
TennerDent
Newbie
Newbie
Beiträge: 22
Registriert: 6. Jun 2011, 06:44

case-insensitives Kopieren von Dateien

Beitrag von TennerDent » 24. Mär 2017, 15:00

Wahrscheinlich eine ziemliche Anfänger-Frage, zu der ich eine Menge beinahe-Antworten gefunden habe, jedoch nichts, was mein Problem wirklich löst. Vielleicht hat hier ja jemand eine Idee:

Auf meinem Linux-System habe ich einige Daten in in einer etwas komplexeren Datei/Verzeichnis-Struktur abgelegt (ca. 18000 Dateien in mehreren Ebenen von Unterverzeichnissen). Alle Dateien/Verzeichnisse sind mit Kleinbuchstaben benannt.
Der gleiche Verzeichnisbaum besteht auch auf einem Windows-System, allerdings sind die Datei- und Verzeichnisnamen hier eine bunte Mischung aus Klein- und Großbuchstaben.

Einige der Dateien auf dem Windows-Rechner haben sich jetzt geändert und ich möchte die Daten unter Linux gerne mit jenen "updaten".

Gibt es eine halbwegs komfortable Möglichkeit, Linux für den Kopiervorgang die Unterscheidung von Klein- und Großbuchstaben abzugewöhnen?

Ich muß so etwas

Code: Alles auswählen

ordner1
	-dateiname1
	-dateiname2
	-dateiname3
ordner2
ordner3
...
hiermit überschreiben

Code: Alles auswählen

Ordner1
	-DateiName1
	-dateiname2
	-DATEINAME3
ordner2
ORDNER3
...
ohne am Ende Dateien oder Verzeinisse durch das Kopieren zu "verdoppeln".

Ist das möglich oder komme ich nicht drumherum, mir jeweils den gesamten Verzeichnisbaum bei Linux zu löschen und von dem Windows-Rechner zu kopieren? Oder erst einmal alles manuell in Kleinbuchstaben umzubenennen?

Werbung:
abgdf
Guru
Guru
Beiträge: 2980
Registriert: 13. Apr 2004, 21:15

Re: case-insensitives Kopieren von Dateien

Beitrag von abgdf » 24. Mär 2017, 15:28

Willst Du im optimalen Fall das Kuddelmuddel der Groß- und Kleinbuchstaben erhalten, oder willst Du in der Linux-Partition (so wie bisher) lieber alles in Kleinbuchstaben haben?

TennerDent
Newbie
Newbie
Beiträge: 22
Registriert: 6. Jun 2011, 06:44

Re: case-insensitives Kopieren von Dateien

Beitrag von TennerDent » 24. Mär 2017, 15:54

Das ist egal. Optisch sind Kleinbuchstaben natürlich schöner. Praktisch kann ich beides weiter verarbeiten.

marce
Advanced Hacker
Advanced Hacker
Beiträge: 897
Registriert: 19. Jun 2008, 13:16
Wohnort: Dettenhausen
Kontaktdaten:

Re: case-insensitives Kopieren von Dateien

Beitrag von marce » 24. Mär 2017, 16:16

wie greifst Du denn auf das Windows-System zu?

einen "einfachen, fertigen" Befehl wüsste ich jetzt nicht - aber mit ein wenig Scritping lässt sich das recht gut hinbekommen. Einfacher wäre natürlich, z.B. via rsync einen kompletten Abgleich zu fahren, "den Müll" mit zu übernehmen und den hinterher per Dublettensuche zu eliminieren.

Grundsätzlich sind unterschiedliche Dateisysteme mit unterschiedlichen Features immer ein Problem bei Datenabgleich. Und Du solltest vorher entscheiden, welches denn das führende System von beiden ist und dort die Bereinigung erledigen.

Alterantiv - für den Anfang mit umfangreicherem Abgleich-Volumen leben und rsync mit delete- Option - dann hast Du hinterher auf System B den Stand von A und kann von da an weiter arbeiten.

abgdf
Guru
Guru
Beiträge: 2980
Registriert: 13. Apr 2004, 21:15

Re: case-insensitives Kopieren von Dateien

Beitrag von abgdf » 24. Mär 2017, 20:21

Diese paar Zeilen würden schon "/windows/C" durchsuchen und alle Dateinamen insgesamt in Kleinschreibung ausgeben:

Code: Alles auswählen

#!/usr/bin/perl

use warnings;
use strict;

use File::Find;

my $windows = "/windows/C";

find(\&wanted, $windows);

sub wanted {
    print lc($File::Find::name) . "\n";
}
Von da kann man je nachdem weitermachen.
Ich könnte das also locker schreiben. Ist nur'n bißchen schwierig mit dem Testen und mit Deinen konkreten Verhältnissen.

Benutzeravatar
robi
Moderator
Moderator
Beiträge: 3141
Registriert: 25. Aug 2004, 02:13

Re: case-insensitives Kopieren von Dateien

Beitrag von robi » 25. Mär 2017, 03:09

Das scheint eine recht interessante Aufgabe dahinter zustecken. Ich hab mal was probiert. ;)
Zuerst habe ich mir ein Windows Verzeichnis für die original Dateien erstellt und darin per Script ein paar Verzeichnisse und Dateien mit Groß+Kleinschreibung

Code: Alles auswählen

robi@ULTRA-01:/tmp/test> find Windows/
Windows/
Windows/Test1
Windows/Test1/TeSt1
Windows/Test1/TeSt1/tEst9
Windows/Test1/TeSt1/tEst9/TeSt5
Windows/Test1/TeSt1/tEst9/TeSt5/Hupe
Windows/Test1/TeSt1/tEst9/TeSt5/Fahrad
Windows/Test1/TeSt1/tEst9/TeSt5/Auto
Windows/Test1/TeSt1/tEst9/TeSt5/Bremse
Windows/Test1/TeSt1/tEst9/TeSt5/Moped
Windows/Test1/TeSt9
Windows/Test1/TeSt9/tEst7
Windows/Test1/TeSt9/tEst7/TeSt3
Windows/Test1/TeSt9/tEst7/TeSt3/Hupe
Windows/Test1/TeSt9/tEst7/TeSt3/Fahrad
Windows/Test1/TeSt9/tEst7/TeSt3/Auto
Windows/Test1/TeSt9/tEst7/TeSt3/Bremse
Windows/Test1/TeSt9/tEst7/TeSt3/Moped
Windows/Test1/tesT2
Windows/Test1/tesT2/TeSt3
Windows/Test1/tesT2/TeSt3/tEst5
Windows/Test1/tesT2/TeSt3/tEst5/Hupe
Windows/Test1/tesT2/TeSt3/tEst5/Fahrad
Windows/Test1/tesT2/TeSt3/tEst5/Auto
Windows/Test1/tesT2/TeSt3/tEst5/Bremse
Windows/Test1/tesT2/TeSt3/tEst5/Moped
Windows/Test1/tesT2/TeSt7
Windows/Test1/tesT2/TeSt7/tEst9
Windows/Test1/tesT2/TeSt7/tEst9/Hupe
Windows/Test1/tesT2/TeSt7/tEst9/Fahrad
Windows/Test1/tesT2/TeSt7/tEst9/Auto
Windows/Test1/tesT2/TeSt7/tEst9/Bremse
Windows/Test1/tesT2/TeSt7/tEst9/Moped
Windows/Test1/tesT2/TeSt4
Windows/Test1/tesT2/TeSt4/tEst6
Windows/Test1/tesT2/TeSt4/tEst6/Hupe
Windows/Test1/tesT2/TeSt4/tEst6/Fahrad
Windows/Test1/tesT2/TeSt4/tEst6/Auto
Windows/Test1/tesT2/TeSt4/tEst6/Bremse
Windows/Test1/tesT2/TeSt4/tEst6/Moped
Windows/Test1/TeST8
Windows/Test1/TeST8/tEst4
Windows/Test1/TeST8/tEst4/TeSt1
Windows/Test1/TeST8/tEst4/TeSt1/Hupe
Windows/Test1/TeST8/tEst4/TeSt1/Fahrad
Windows/Test1/TeST8/tEst4/TeSt1/Auto
Windows/Test1/TeST8/tEst4/TeSt1/Bremse
Windows/Test1/TeST8/tEst4/TeSt1/Moped
und genau hier liegt auch schon die erste Problematik, das ganze muss noch eindeutig sein wenn man die Großbuchstaben in Kleinbuchstaben tranferiert hat, also "tesT2" und "TeSt2" in einem Verzeichnis ist nicht mehr eindeutig und würde im folgendem Verlauf meiner Tests irgendwo aufschlagen.
Damit das Ganze nicht zu kompliziert wird, habe ich Leerzeichen und andere Sonderzeichen in Datei- und Verzeichnisnamen und ähnliche Schweinereien vollkommen unbeachtet gelassen.

Als nächsten habe ich dann ein Verzeichnis Linux erstellt. und die Dateien dort hineinkopiert (für unsere Tests am besten gleich mit rsync).

Code: Alles auswählen

robi@ULTRA-01:/tmp/test> mkdir Linux
robi@ULTRA-01:/tmp/test> rsync -av Windows/ Linux/
....

robi@ULTRA-01:/tmp/test> find  Windows Linux | sort |  pr --column=2 -w 100 -
Linux                                             Windows
Linux/Test1                                       Windows/Test1
Linux/Test1/TeSt1                                 Windows/Test1/TeSt1
Linux/Test1/TeSt1/tEst9                           Windows/Test1/TeSt1/tEst9
Linux/Test1/TeSt1/tEst9/TeSt5                     Windows/Test1/TeSt1/tEst9/TeSt5
Linux/Test1/TeSt1/tEst9/TeSt5/Auto                Windows/Test1/TeSt1/tEst9/TeSt5/Auto
Linux/Test1/TeSt1/tEst9/TeSt5/Bremse              Windows/Test1/TeSt1/tEst9/TeSt5/Bremse
Linux/Test1/TeSt1/tEst9/TeSt5/Fahrad              Windows/Test1/TeSt1/tEst9/TeSt5/Fahrad
Linux/Test1/TeSt1/tEst9/TeSt5/Hupe                Windows/Test1/TeSt1/tEst9/TeSt5/Hupe
Linux/Test1/TeSt1/tEst9/TeSt5/Moped               Windows/Test1/TeSt1/tEst9/TeSt5/Moped
Linux/Test1/tesT2                                 Windows/Test1/tesT2
Linux/Test1/tesT2/TeSt3                           Windows/Test1/tesT2/TeSt3
Linux/Test1/tesT2/TeSt3/tEst5                     Windows/Test1/tesT2/TeSt3/tEst5
Linux/Test1/tesT2/TeSt3/tEst5/Auto                Windows/Test1/tesT2/TeSt3/tEst5/Auto
Linux/Test1/tesT2/TeSt3/tEst5/Bremse              Windows/Test1/tesT2/TeSt3/tEst5/Bremse
Linux/Test1/tesT2/TeSt3/tEst5/Fahrad              Windows/Test1/tesT2/TeSt3/tEst5/Fahrad
Linux/Test1/tesT2/TeSt3/tEst5/Hupe                Windows/Test1/tesT2/TeSt3/tEst5/Hupe
Linux/Test1/tesT2/TeSt3/tEst5/Moped               Windows/Test1/tesT2/TeSt3/tEst5/Moped
Linux/Test1/tesT2/TeSt4                           Windows/Test1/tesT2/TeSt4
Linux/Test1/tesT2/TeSt4/tEst6                     Windows/Test1/tesT2/TeSt4/tEst6
Linux/Test1/tesT2/TeSt4/tEst6/Auto                Windows/Test1/tesT2/TeSt4/tEst6/Auto
Linux/Test1/tesT2/TeSt4/tEst6/Bremse              Windows/Test1/tesT2/TeSt4/tEst6/Bremse
Linux/Test1/tesT2/TeSt4/tEst6/Fahrad              Windows/Test1/tesT2/TeSt4/tEst6/Fahrad
Linux/Test1/tesT2/TeSt4/tEst6/Hupe                Windows/Test1/tesT2/TeSt4/tEst6/Hupe
Linux/Test1/tesT2/TeSt4/tEst6/Moped               Windows/Test1/tesT2/TeSt4/tEst6/Moped
Linux/Test1/tesT2/TeSt7                           Windows/Test1/tesT2/TeSt7
Linux/Test1/tesT2/TeSt7/tEst9                     Windows/Test1/tesT2/TeSt7/tEst9
Linux/Test1/tesT2/TeSt7/tEst9/Auto                Windows/Test1/tesT2/TeSt7/tEst9/Auto
Linux/Test1/tesT2/TeSt7/tEst9/Bremse              Windows/Test1/tesT2/TeSt7/tEst9/Bremse
Linux/Test1/tesT2/TeSt7/tEst9/Fahrad              Windows/Test1/tesT2/TeSt7/tEst9/Fahrad
Linux/Test1/tesT2/TeSt7/tEst9/Hupe                Windows/Test1/tesT2/TeSt7/tEst9/Hupe
Linux/Test1/tesT2/TeSt7/tEst9/Moped               Windows/Test1/tesT2/TeSt7/tEst9/Moped
Linux/Test1/TeST8                                 Windows/Test1/TeST8
Linux/Test1/TeST8/tEst4                           Windows/Test1/TeST8/tEst4
Linux/Test1/TeST8/tEst4/TeSt1                     Windows/Test1/TeST8/tEst4/TeSt1
Linux/Test1/TeST8/tEst4/TeSt1/Auto                Windows/Test1/TeST8/tEst4/TeSt1/Auto
Linux/Test1/TeST8/tEst4/TeSt1/Bremse              Windows/Test1/TeST8/tEst4/TeSt1/Bremse
Linux/Test1/TeST8/tEst4/TeSt1/Fahrad              Windows/Test1/TeST8/tEst4/TeSt1/Fahrad
Linux/Test1/TeST8/tEst4/TeSt1/Hupe                Windows/Test1/TeST8/tEst4/TeSt1/Hupe
Linux/Test1/TeST8/tEst4/TeSt1/Moped               Windows/Test1/TeST8/tEst4/TeSt1/Moped
Linux/Test1/TeSt9                                 Windows/Test1/TeSt9
Linux/Test1/TeSt9/tEst7                           Windows/Test1/TeSt9/tEst7
Linux/Test1/TeSt9/tEst7/TeSt3                     Windows/Test1/TeSt9/tEst7/TeSt3
Linux/Test1/TeSt9/tEst7/TeSt3/Auto                Windows/Test1/TeSt9/tEst7/TeSt3/Auto
Linux/Test1/TeSt9/tEst7/TeSt3/Bremse              Windows/Test1/TeSt9/tEst7/TeSt3/Bremse
Linux/Test1/TeSt9/tEst7/TeSt3/Fahrad              Windows/Test1/TeSt9/tEst7/TeSt3/Fahrad
Linux/Test1/TeSt9/tEst7/TeSt3/Hupe                Windows/Test1/TeSt9/tEst7/TeSt3/Hupe
Linux/Test1/TeSt9/tEst7/TeSt3/Moped               Windows/Test1/TeSt9/tEst7/TeSt3/Moped
Danach habe ich im Linux Verzeichnis die Dateinamen und Verzeichnisnamen alle klein gemacht.

Code: Alles auswählen

robi@ULTRA-01:/tmp/test> find Linux | tac | while read F; do  FD=$(dirname $F); FN=$(basename $F); FN=${FN,,}; mv "$F" "$FD/$FN" ; done 
Das Script ist noch ein wenig übereifrig, es macht aus dem Linux-Verzeichnis ein linux-Verzeichnis, aber das ist schnell behoben.

Code: Alles auswählen

robi@ULTRA-01:/tmp/test> mv linux Linux
robi@ULTRA-01:/tmp/test> find  Windows Linux | sort |  pr --column=2 -w 100 -
Linux                                             Windows
Linux/test1                                       Windows/Test1
Linux/test1/test1                                 Windows/Test1/TeSt1
Linux/test1/test1/test9                           Windows/Test1/TeSt1/tEst9
Linux/test1/test1/test9/test5                     Windows/Test1/TeSt1/tEst9/TeSt5
Linux/test1/test1/test9/test5/auto                Windows/Test1/TeSt1/tEst9/TeSt5/Auto
Linux/test1/test1/test9/test5/bremse              Windows/Test1/TeSt1/tEst9/TeSt5/Bremse
Linux/test1/test1/test9/test5/fahrad              Windows/Test1/TeSt1/tEst9/TeSt5/Fahrad
Linux/test1/test1/test9/test5/hupe                Windows/Test1/TeSt1/tEst9/TeSt5/Hupe
Linux/test1/test1/test9/test5/moped               Windows/Test1/TeSt1/tEst9/TeSt5/Moped
Linux/test1/test2                                 Windows/Test1/tesT2
Linux/test1/test2/test3                           Windows/Test1/tesT2/TeSt3
Linux/test1/test2/test3/test5                     Windows/Test1/tesT2/TeSt3/tEst5
Linux/test1/test2/test3/test5/auto                Windows/Test1/tesT2/TeSt3/tEst5/Auto
Linux/test1/test2/test3/test5/bremse              Windows/Test1/tesT2/TeSt3/tEst5/Bremse
Linux/test1/test2/test3/test5/fahrad              Windows/Test1/tesT2/TeSt3/tEst5/Fahrad
Linux/test1/test2/test3/test5/hupe                Windows/Test1/tesT2/TeSt3/tEst5/Hupe
Linux/test1/test2/test3/test5/moped               Windows/Test1/tesT2/TeSt3/tEst5/Moped
Linux/test1/test2/test4                           Windows/Test1/tesT2/TeSt4
Linux/test1/test2/test4/test6                     Windows/Test1/tesT2/TeSt4/tEst6
Linux/test1/test2/test4/test6/auto                Windows/Test1/tesT2/TeSt4/tEst6/Auto
Linux/test1/test2/test4/test6/bremse              Windows/Test1/tesT2/TeSt4/tEst6/Bremse
Linux/test1/test2/test4/test6/fahrad              Windows/Test1/tesT2/TeSt4/tEst6/Fahrad
Linux/test1/test2/test4/test6/hupe                Windows/Test1/tesT2/TeSt4/tEst6/Hupe
Linux/test1/test2/test4/test6/moped               Windows/Test1/tesT2/TeSt4/tEst6/Moped
Linux/test1/test2/test7                           Windows/Test1/tesT2/TeSt7
Linux/test1/test2/test7/test9                     Windows/Test1/tesT2/TeSt7/tEst9
Linux/test1/test2/test7/test9/auto                Windows/Test1/tesT2/TeSt7/tEst9/Auto
Linux/test1/test2/test7/test9/bremse              Windows/Test1/tesT2/TeSt7/tEst9/Bremse
Linux/test1/test2/test7/test9/fahrad              Windows/Test1/tesT2/TeSt7/tEst9/Fahrad
Linux/test1/test2/test7/test9/hupe                Windows/Test1/tesT2/TeSt7/tEst9/Hupe
Linux/test1/test2/test7/test9/moped               Windows/Test1/tesT2/TeSt7/tEst9/Moped
Linux/test1/test8                                 Windows/Test1/TeST8
Linux/test1/test8/test4                           Windows/Test1/TeST8/tEst4
Linux/test1/test8/test4/test1                     Windows/Test1/TeST8/tEst4/TeSt1
Linux/test1/test8/test4/test1/auto                Windows/Test1/TeST8/tEst4/TeSt1/Auto
Linux/test1/test8/test4/test1/bremse              Windows/Test1/TeST8/tEst4/TeSt1/Bremse
Linux/test1/test8/test4/test1/fahrad              Windows/Test1/TeST8/tEst4/TeSt1/Fahrad
Linux/test1/test8/test4/test1/hupe                Windows/Test1/TeST8/tEst4/TeSt1/Hupe
Linux/test1/test8/test4/test1/moped               Windows/Test1/TeST8/tEst4/TeSt1/Moped
Linux/test1/test9                                 Windows/Test1/TeSt9
Linux/test1/test9/test7                           Windows/Test1/TeSt9/tEst7
Linux/test1/test9/test7/test3                     Windows/Test1/TeSt9/tEst7/TeSt3
Linux/test1/test9/test7/test3/auto                Windows/Test1/TeSt9/tEst7/TeSt3/Auto
Linux/test1/test9/test7/test3/bremse              Windows/Test1/TeSt9/tEst7/TeSt3/Bremse
Linux/test1/test9/test7/test3/fahrad              Windows/Test1/TeSt9/tEst7/TeSt3/Fahrad
Linux/test1/test9/test7/test3/hupe                Windows/Test1/TeSt9/tEst7/TeSt3/Hupe
Linux/test1/test9/test7/test3/moped               Windows/Test1/TeSt9/tEst7/TeSt3/Moped
Schön zu sehen , jetzt sollten wir die Ausgangskonfiguration von User: TennerDent haben, im Windows ist alles Groß+Klein und im Linux alles nur klein, aber sonst ist alles (hoffentlich) gleich und eindeutig.

Meine Idee jetzt ist folgende: eine 2. zusätzliche Dateistruktur (Verzeichnis Linuz) anlegen, in der die Verzeichnis und Dateinamen genauso wie im Windows Groß+Klein geschrieben sind, aber bei dem die richtigen Dateien, also die wirklichen Daten Hardlinks auf die kleingeschriebenen Daten-Dateien aus dem Linux-Verzeichnis sind.
Damit haben wir im Linux dann den ganzen Baum 2 mal, einmal alles Kleingeschrieben im Verzeichnis Linux und einmal als Sammlung von Hardlinks mit genau den selben Datei- und Verzeichnisnamen wie sie im Windows Verzeichnis sind. Klingt, kompliziert, aber kann man mit einem kleinem Script erledigen.

Code: Alles auswählen

#!/bin/bash
WINDIR="/tmp/test/Windows"
LINDIR="/tmp/test/Linux"
NEUDIR="/tmp/test/Linuz"

mkdir -p ${NEUDIR}

find ${WINDIR} -mindepth 1 -type d | while read DIR 
do 
        DIR=${DIR#$WINDIR/} 
        mkdir -p ${NEUDIR}/${DIR}
done
find ${WINDIR} -mindepth 1 -type f | while read FILE
do
        FILENEU=${FILE#$WINDIR/} 
        FILELINK=${FILENEU,,}
        ln ${LINDIR}/${FILELINK} ${NEUDIR}/${FILENEU}
done
Am Anfang des Scriptes kann man die 3 Verzeichnisse entsprechend seinen Gegebenheiten anpassen. NEUDIR ist das Verzeichnis für die neue Struktur die wir anlegen wollen.
(ich hoffe ihr habt alle einen breiten Bildschrim, ansonsten müsst ihr das folgende mal in eine Textdatei kopieren, damit die Formatierung und Gegenüberstellung passt.

Code: Alles auswählen

robi@ULTRA-01:/tmp/test> sh script.sh 
robi@ULTRA-01:/tmp/test> find  Windows Linux Linuz | sort |  pr --column=3 -w 150 -
Linux                                             Linuz                                             Windows
Linux/test1                                       Linuz/Test1                                       Windows/Test1
Linux/test1/test1                                 Linuz/Test1/TeSt1                                 Windows/Test1/TeSt1
Linux/test1/test1/test9                           Linuz/Test1/TeSt1/tEst9                           Windows/Test1/TeSt1/tEst9
Linux/test1/test1/test9/test5                     Linuz/Test1/TeSt1/tEst9/TeSt5                     Windows/Test1/TeSt1/tEst9/TeSt5
Linux/test1/test1/test9/test5/auto                Linuz/Test1/TeSt1/tEst9/TeSt5/Auto                Windows/Test1/TeSt1/tEst9/TeSt5/Auto
Linux/test1/test1/test9/test5/bremse              Linuz/Test1/TeSt1/tEst9/TeSt5/Bremse              Windows/Test1/TeSt1/tEst9/TeSt5/Bremse
Linux/test1/test1/test9/test5/fahrad              Linuz/Test1/TeSt1/tEst9/TeSt5/Fahrad              Windows/Test1/TeSt1/tEst9/TeSt5/Fahrad
Linux/test1/test1/test9/test5/hupe                Linuz/Test1/TeSt1/tEst9/TeSt5/Hupe                Windows/Test1/TeSt1/tEst9/TeSt5/Hupe
Linux/test1/test1/test9/test5/moped               Linuz/Test1/TeSt1/tEst9/TeSt5/Moped               Windows/Test1/TeSt1/tEst9/TeSt5/Moped
Linux/test1/test2                                 Linuz/Test1/tesT2                                 Windows/Test1/tesT2
Linux/test1/test2/test3                           Linuz/Test1/tesT2/TeSt3                           Windows/Test1/tesT2/TeSt3
Linux/test1/test2/test3/test5                     Linuz/Test1/tesT2/TeSt3/tEst5                     Windows/Test1/tesT2/TeSt3/tEst5
Linux/test1/test2/test3/test5/auto                Linuz/Test1/tesT2/TeSt3/tEst5/Auto                Windows/Test1/tesT2/TeSt3/tEst5/Auto
Linux/test1/test2/test3/test5/bremse              Linuz/Test1/tesT2/TeSt3/tEst5/Bremse              Windows/Test1/tesT2/TeSt3/tEst5/Bremse
Linux/test1/test2/test3/test5/fahrad              Linuz/Test1/tesT2/TeSt3/tEst5/Fahrad              Windows/Test1/tesT2/TeSt3/tEst5/Fahrad
Linux/test1/test2/test3/test5/hupe                Linuz/Test1/tesT2/TeSt3/tEst5/Hupe                Windows/Test1/tesT2/TeSt3/tEst5/Hupe
Linux/test1/test2/test3/test5/moped               Linuz/Test1/tesT2/TeSt3/tEst5/Moped               Windows/Test1/tesT2/TeSt3/tEst5/Moped
Linux/test1/test2/test4                           Linuz/Test1/tesT2/TeSt4                           Windows/Test1/tesT2/TeSt4
Linux/test1/test2/test4/test6                     Linuz/Test1/tesT2/TeSt4/tEst6                     Windows/Test1/tesT2/TeSt4/tEst6
Linux/test1/test2/test4/test6/auto                Linuz/Test1/tesT2/TeSt4/tEst6/Auto                Windows/Test1/tesT2/TeSt4/tEst6/Auto
Linux/test1/test2/test4/test6/bremse              Linuz/Test1/tesT2/TeSt4/tEst6/Bremse              Windows/Test1/tesT2/TeSt4/tEst6/Bremse
Linux/test1/test2/test4/test6/fahrad              Linuz/Test1/tesT2/TeSt4/tEst6/Fahrad              Windows/Test1/tesT2/TeSt4/tEst6/Fahrad
Linux/test1/test2/test4/test6/hupe                Linuz/Test1/tesT2/TeSt4/tEst6/Hupe                Windows/Test1/tesT2/TeSt4/tEst6/Hupe
Linux/test1/test2/test4/test6/moped               Linuz/Test1/tesT2/TeSt4/tEst6/Moped               Windows/Test1/tesT2/TeSt4/tEst6/Moped
Linux/test1/test2/test7                           Linuz/Test1/tesT2/TeSt7                           Windows/Test1/tesT2/TeSt7
Linux/test1/test2/test7/test9                     Linuz/Test1/tesT2/TeSt7/tEst9                     Windows/Test1/tesT2/TeSt7/tEst9
Linux/test1/test2/test7/test9/auto                Linuz/Test1/tesT2/TeSt7/tEst9/Auto                Windows/Test1/tesT2/TeSt7/tEst9/Auto
Linux/test1/test2/test7/test9/bremse              Linuz/Test1/tesT2/TeSt7/tEst9/Bremse              Windows/Test1/tesT2/TeSt7/tEst9/Bremse
Linux/test1/test2/test7/test9/fahrad              Linuz/Test1/tesT2/TeSt7/tEst9/Fahrad              Windows/Test1/tesT2/TeSt7/tEst9/Fahrad
Linux/test1/test2/test7/test9/hupe                Linuz/Test1/tesT2/TeSt7/tEst9/Hupe                Windows/Test1/tesT2/TeSt7/tEst9/Hupe
Linux/test1/test2/test7/test9/moped               Linuz/Test1/tesT2/TeSt7/tEst9/Moped               Windows/Test1/tesT2/TeSt7/tEst9/Moped
Linux/test1/test8                                 Linuz/Test1/TeST8                                 Windows/Test1/TeST8
Linux/test1/test8/test4                           Linuz/Test1/TeST8/tEst4                           Windows/Test1/TeST8/tEst4
Linux/test1/test8/test4/test1                     Linuz/Test1/TeST8/tEst4/TeSt1                     Windows/Test1/TeST8/tEst4/TeSt1
Linux/test1/test8/test4/test1/auto                Linuz/Test1/TeST8/tEst4/TeSt1/Auto                Windows/Test1/TeST8/tEst4/TeSt1/Auto
Linux/test1/test8/test4/test1/bremse              Linuz/Test1/TeST8/tEst4/TeSt1/Bremse              Windows/Test1/TeST8/tEst4/TeSt1/Bremse
Linux/test1/test8/test4/test1/fahrad              Linuz/Test1/TeST8/tEst4/TeSt1/Fahrad              Windows/Test1/TeST8/tEst4/TeSt1/Fahrad
Linux/test1/test8/test4/test1/hupe                Linuz/Test1/TeST8/tEst4/TeSt1/Hupe                Windows/Test1/TeST8/tEst4/TeSt1/Hupe
Linux/test1/test8/test4/test1/moped               Linuz/Test1/TeST8/tEst4/TeSt1/Moped               Windows/Test1/TeST8/tEst4/TeSt1/Moped
Linux/test1/test9                                 Linuz/Test1/TeSt9                                 Windows/Test1/TeSt9
Linux/test1/test9/test7                           Linuz/Test1/TeSt9/tEst7                           Windows/Test1/TeSt9/tEst7
Linux/test1/test9/test7/test3                     Linuz/Test1/TeSt9/tEst7/TeSt3                     Windows/Test1/TeSt9/tEst7/TeSt3
Linux/test1/test9/test7/test3/auto                Linuz/Test1/TeSt9/tEst7/TeSt3/Auto                Windows/Test1/TeSt9/tEst7/TeSt3/Auto
Linux/test1/test9/test7/test3/bremse              Linuz/Test1/TeSt9/tEst7/TeSt3/Bremse              Windows/Test1/TeSt9/tEst7/TeSt3/Bremse
Linux/test1/test9/test7/test3/fahrad              Linuz/Test1/TeSt9/tEst7/TeSt3/Fahrad              Windows/Test1/TeSt9/tEst7/TeSt3/Fahrad
Linux/test1/test9/test7/test3/hupe                Linuz/Test1/TeSt9/tEst7/TeSt3/Hupe                Windows/Test1/TeSt9/tEst7/TeSt3/Hupe
Linux/test1/test9/test7/test3/moped               Linuz/Test1/TeSt9/tEst7/TeSt3/Moped               Windows/Test1/TeSt9/tEst7/TeSt3/Moped
Jetzt kann ich einfach das Windows-Verzeichnis mit dem Linuz-Verzeichnis Synchronisieren, aber immer noch im Linux-Verzeichnis den Luxus der "Nur-kleinschreibung" genießen, auch noch nach der Synchronisation. Und die Synchronisation sollte theoretisch im Idealfall, sowohl in die Eine als auch in die Andere Richtung funktionieren. (Aber nur für schon bestehende Dateien, kommt in einem der 3 Verzeichnissbäume eine Datei neu hinzu, müssten erst wieder dafür die Hardlinks eingerichtet werden)
In unserem Fall sind keine Daten Dateien geändert worden, nur die Zeitstempel des Dateisystems auf Linuz ist anders als im Windows-Verzeichnis (da mittels Script angelegt und nicht durch Synchronisation), und dieses sollte rsync jetzt richtig erkennen und entsprechend nur die Verzeichnisse neu synchronisieren und die Datendateien gar nicht anfassen.

Code: Alles auswählen

robi@ULTRA-01:/tmp/test> rsync -av Windows/ Linuz
sending incremental file list
./
Test1/
Test1/TeST8/
Test1/TeST8/tEst4/
Test1/TeST8/tEst4/TeSt1/
Test1/TeSt1/
Test1/TeSt1/tEst9/
Test1/TeSt1/tEst9/TeSt5/
Test1/TeSt9/
Test1/TeSt9/tEst7/
Test1/TeSt9/tEst7/TeSt3/
Test1/tesT2/
Test1/tesT2/TeSt3/
Test1/tesT2/TeSt3/tEst5/
Test1/tesT2/TeSt4/
Test1/tesT2/TeSt4/tEst6/
Test1/tesT2/TeSt7/
Test1/tesT2/TeSt7/tEst9/

sent 817 bytes  received 83 bytes  1800.00 bytes/sec
total size is 540  speedup is 0.60
Eine Änderung einer Datendatei im Windows mit anschließender Synchronisation mit dem Linuz -Verzeichnis sollte nur diese eine Datei neu schreiben und die Änderung bei richtigen Optionen sogar anschließend auch im Linux-Verzeichnis wieder zu finden sein. Ein bisschen aufpassen muss man also doch noch mit den rsync Parametern, sonst geht der Hardlink ins Linux-Verzeichnis verloren.

Code: Alles auswählen

robi@ULTRA-01:/tmp/test> cat Linux/test1/test1/test9/test5/auto
Hallo Auto Hallo

robi@ULTRA-01:/tmp/test> echo "ich wurde geändert" >>  Windows/Test1/TeSt1/tEst9/TeSt5/Auto
robi@ULTRA-01:/tmp/test> rsync -av --inplace  Windows/ Linuz
sending incremental file list
Test1/TeSt1/tEst9/TeSt5/Auto

sent 858 bytes  received 48 bytes  1812.00 bytes/sec
total size is 563  speedup is 0.62
robi@ULTRA-01:/tmp/test> cat Linux/test1/test1/test9/test5/auto
Hallo Auto Hallo

ich wurde geändert
Ziel erreicht, ;) ;) ;) ;) ;) ;)
Aber Vorsicht, was hier im Test und theoretisch so schön und wunderbar einfach ausschaut, kann in der Praxis genauso gut auch durch Kleinigkeiten (Umlaute, Sonderzeichen, Leerzeichen,.....) wunderbar kompliziert werden.

robi

abgdf
Guru
Guru
Beiträge: 2980
Registriert: 13. Apr 2004, 21:15

Re: case-insensitives Kopieren von Dateien

Beitrag von abgdf » 25. Mär 2017, 13:54

robi hat geschrieben:
25. Mär 2017, 03:09
Aber Vorsicht, was hier im Test und theoretisch so schön und wunderbar einfach ausschaut, kann in der Praxis genauso gut auch durch Kleinigkeiten (Umlaute, Sonderzeichen, Leerzeichen,.....) wunderbar kompliziert werden.
Genau, deshalb hatte ich auch noch kein fertiges Skript präsentiert.

Klar kann es mit Groß- und Kleinbuchstaben auf der Windows-Partition Mehrdeutiges geben, das dann - mit nur Kleinbuchstaben - zu nur einer Version wird, wobei ein Teil wegfällt. Deshalb war ich mir nicht sicher wegen seiner "Verhältnisse". Das heißt, wäre das ok, wenn was wegfällt, wie ist es jetzt?, usw.
Edit: Oder unterscheidet Windows gar nicht Groß- und Kleinbuchstaben, so daß es doch immer eindeutig ist, so als wären es nur Kleinbuchstaben?

Wahrscheinlich wäre es tatsächlich am sichersten, den Zielordner zu löschen und von der Windows-Partition neu rüberzukopieren. Viel Arbeit für den Rechner, dafür weniger für den User. ;)

Gräfin Klara
Hacker
Hacker
Beiträge: 256
Registriert: 23. Jun 2008, 20:51

Re: case-insensitives Kopieren von Dateien

Beitrag von Gräfin Klara » 25. Mär 2017, 17:55

Code: Alles auswählen

while IFS= read -r; do
	flc="${REPLY/\/mnt\/windows/}"
	flc="${flc,,}"
	printf "Kopiere von %s nach /linux/%s\n" "$REPLY" "$flc"
	rsync -a "$REPLY" "/linux/$flc"
done <<< "$(find '/mnt/windows/ordner' -name '*')"
Gruß
Gräfin Klara

drcux
Hacker
Hacker
Beiträge: 370
Registriert: 9. Aug 2005, 12:14

Re: case-insensitives Kopieren von Dateien

Beitrag von drcux » 25. Mär 2017, 20:47

Windows kennt keine Groß-/Kleinschreibung, auch nicht Windows 10. Es kann also eigentlich keine Datei test.txt und Test.txt in einem Verzeichnis existieren....

Benutzeravatar
robi
Moderator
Moderator
Beiträge: 3141
Registriert: 25. Aug 2004, 02:13

Re: case-insensitives Kopieren von Dateien

Beitrag von robi » 25. Mär 2017, 21:05

Gräfin Klara hat geschrieben:
25. Mär 2017, 17:55

Code: Alles auswählen

while IFS= read -r; do
	flc="${REPLY/\/mnt\/windows/}"
	flc="${flc,,}"
	printf "Kopiere von %s nach /linux/%s\n" "$REPLY" "$flc"
	rsync -a "$REPLY" "/linux/$flc"
done <<< "$(find '/mnt/windows/ordner' -name '*')"
Hast du das ausprobiert? So einfach ist das nicht zu erledigen. :/
Die Ausgabe die es produziert sieht ja fast noch normal aus , aber schon beim genaueren Hinsehen sieht man die Probleme zB. gleich in der ersten Zeile schreibt er, das er jetzt den ganzen Windowsbaum mal komplett nach nach linux kopiert wird, und zwar alles Groß+Kleine 1 zu 1.
Danach macht er das dann mit Teilbäumen auch noch mehrfach nur das er dann noch zusätzlich die Dateien und Verzeichnisse noch mal kleingeschrieben anlegt und dann die Dateien zusätzlich auch noch kleingeschrieben dort hinkopiert.

Das Script macht genau das, was es überhaupt nicht machen soll. :???:
Bei meinen paar Testdaten ist bei den Datenfiles die 6-Fache Menge herausgekommen, statt 30 ganze 180. Und bei einer entsprechend großen und breiten Dateistruktur kann das durchaus auch die 100 ober 1000 Fache Menge an Dateien ergeben, je nach dem wie groß das Zielverzeichnis ist, ( Aufgabenstellung hier glaube was von 150000 Dateien gelesen zu haben) ist das FS mit 100% Sicherheit vorher voll.

Es gibt wahrscheinlich nur einen vernünftigen Lösungsweg, die Mount- und Kopieroption wiederfinden mit der beim ursprünglichen Kopieren die Dateinamen alle klein geschrieben worden sind ....

robi

Gräfin Klara
Hacker
Hacker
Beiträge: 256
Registriert: 23. Jun 2008, 20:51

Re: case-insensitives Kopieren von Dateien

Beitrag von Gräfin Klara » 26. Mär 2017, 11:48

robi hat geschrieben:
25. Mär 2017, 21:05
Hast du das ausprobiert? So einfach ist das nicht zu erledigen
Nein, ich habe es nicht probiert
robi hat geschrieben:
25. Mär 2017, 21:05
... den ganzen Windowsbaum mal komplett nach nach linux kopiert wird, und zwar alles Groß+Kleine 1 zu 1.
Richtig, mein Fehler, habe die directories vergessen
Update:

Code: Alles auswählen

while IFS= read -r; do
	flc="${REPLY/\/mnt\/windows/}"
	flc="${flc,,}"
	if [ -d "$REPLY" ]; then
		 	[ -d "/linux$flc" ] || mkdir -p "/linux$flc"
	 		continue
	fi
	printf "Kopiere von %s nach /linux/%s\n" "$REPLY" "$flc"
	rsync -a "$REPLY" "/linux/$flc"
done <<< "$(find '/mnt/windows/ordner' -name '*')"
Gruß
Gräfin Klara

abgdf
Guru
Guru
Beiträge: 2980
Registriert: 13. Apr 2004, 21:15

Re: case-insensitives Kopieren von Dateien

Beitrag von abgdf » 26. Mär 2017, 13:47

Gräfin Klara hat geschrieben:
26. Mär 2017, 11:48
robi hat geschrieben:
25. Mär 2017, 21:05
Hast du das ausprobiert? So einfach ist das nicht zu erledigen
Nein, ich habe es nicht probiert
...
Richtig, mein Fehler, habe die directories vergessen
Nicht zu probieren, aber zu posten, finde ich hier nicht gut. Wahrscheinlich hat der TE (= Threadersteller) gar keine Erfahrung mit Skripten, und wird dann (maximal) genau das ausführen, was hier gepostet wird. Wenn das dann nicht läuft, weil es nicht getestet ist, untergräbt das das Vertrauen in die Skripte hier.
Ich bin nach wie vor der Meinung, daß man seriöserweise bisher kein Skript anbieten kann. Dazu bräuchte es die Zusammenarbeit mit dem TE. Es würde eine gewisse Entwicklungszeit mit zahlreichen Rückmeldungen brauchen, die der TE auch durchhalten müßte.

Alternative wäre (wie gesagt): Alles von Windows aus ganz neu anlegen.

marce
Advanced Hacker
Advanced Hacker
Beiträge: 897
Registriert: 19. Jun 2008, 13:16
Wohnort: Dettenhausen
Kontaktdaten:

Re: case-insensitives Kopieren von Dateien

Beitrag von marce » 26. Mär 2017, 14:25

drcux hat geschrieben:
25. Mär 2017, 20:47
Windows kennt keine Groß-/Kleinschreibung, auch nicht Windows 10. Es kann also eigentlich keine Datei test.txt und Test.txt in einem Verzeichnis existieren....
Falsch. Windows kennt sehr wohl Groß- und Kleinschreibung bei Dateinamen. Es hat bei "Suchen nach Dateinamen" nur keine Auswikrung. Vereinfacht gessgt.

Benutzeravatar
robi
Moderator
Moderator
Beiträge: 3141
Registriert: 25. Aug 2004, 02:13

Re: case-insensitives Kopieren von Dateien

Beitrag von robi » 27. Mär 2017, 08:45

Gräfin Klara hat geschrieben:
26. Mär 2017, 11:48
Update:

Code: Alles auswählen

while IFS= read -r; do
	flc="${REPLY/\/mnt\/windows/}"
	flc="${flc,,}"
	if [ -d "$REPLY" ]; then
		 	[ -d "/linux$flc" ] || mkdir -p "/linux$flc"
	 		continue
	fi
	printf "Kopiere von %s nach /linux/%s\n" "$REPLY" "$flc"
	rsync -a "$REPLY" "/linux/$flc"
done <<< "$(find '/mnt/windows/ordner' -name '*')"
Okay, das scheint soweit zu funktionieren, ist aber so für einen normalen User nicht ausführbar, da es ihm schwer fallen dürfte dieses für seine Zwecke richtig anzupassen.
Aber wie es aussieht haben wir den Thread-Ersteller sowieso schon verschreckt, zu mindestens hat er sich nicht mehr gemeldet.

robi

Gräfin Klara
Hacker
Hacker
Beiträge: 256
Registriert: 23. Jun 2008, 20:51

Re: case-insensitives Kopieren von Dateien

Beitrag von Gräfin Klara » 27. Mär 2017, 14:08

robi hat geschrieben:
27. Mär 2017, 08:45
Okay, das scheint soweit zu funktionieren, ist aber so für einen normalen User nicht ausführbar, da es ihm schwer fallen dürfte dieses für seine Zwecke richtig anzupassen.
Aber wie es aussieht haben wir den Thread-Ersteller sowieso schon verschreckt, zu mindestens hat er sich nicht mehr gemeldet.

robi
Keine Sorge, ich bin sehr wohl bereit, diesen code gemeinsam mit dem Thread-Ersteller so zu bearbeiten, dass er für ihn auch anwendbar ist.

Gruß

Antworten

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast