Dateiliste aus lokaler Textdatei einlesen?

German support forum

Moderators: Hacker, Stefan2, white

User avatar
t.rauner
Junior Member
Junior Member
Posts: 13
Joined: 2012-07-01, 00:10 UTC
Location: Sulzbach-Rosenberg, Germany

Dateiliste aus lokaler Textdatei einlesen?

Post by *t.rauner »

BS: Windows 7 Pro x64 dt.

Hallo,

ich habe mir vor dem Aufrüsten meines NAS (NAS1) mit neuen Festplatten alle darauf befindliche Dateien auf ein zweites NAS (NAS2) gesichert (1:1-Kopie). Dort befinden sich nun alle Dateien in ihren ursprünglichen Ordnern, die auf NAS1 vorhanden waren, plus ältere, obsolete Sicherungskopien.

Ich habe mir nach dem Backup ein Dateiliste von NAS1 angelegt (dir /s/a-d/b NAS1:\*.*), und wollte nun "einfach" die in der Liste gespeicherten Dateien wieder zurücklesen. Und bin schon fast einen halben Tag am ergebnislosen Googeln. Ein einfaches Zurückkopieren - z. B. mit dem TC-Befehl "Verzeichnisse synchronisieren" würde nun alle Dateien plus der unerwünschten obsoleten Dateien auf NAS1 zurück kopieren. Also muss die Kopieraktion unter Berücksichtigung der Liste (Teilmenge der Dateien auf NAS2) stattfinden.

Was ich gefunden habe, sind diverse Vorschlage, die auf "for /f ..."-Schleifen für die Eingabeaufforderung beruhen. So weit, so gut, die Lösung ist grottenlangsam und ein bisschen krude. Die Dateiliste habe ich so modifiziert:

Aus:
\\NAS1\extra\lw_y\Programme\TightVNC\vncviewer.exe
\\NAS1\public\SHELL32.icl
\\NAS1\video\multimedia\Queen\Queen - Love of My Life.flv
...

wurde:
\extra\lw_y\Programme\TightVNC\vncviewer.exe
\public\SHELL32.icl
\video\multimedia\Queen\Queen - Love of My Life.flv
...

Darauf basiert nun der folgende Befehl:
for /f "delims=" %i in (NAS1.lst) do @echo. & @echo Copy \\NAS1%i from & @xcopy /d /y /i "\\NAS2%i" "\\NAS1%i\..\"

Der Befehl führt dann zu Ausgaben wie:
Copy \\NAS1\extra\lw_y\Programme\TightVNC\vncviewer.exe from
\\NAS2\extra\lw_y\Programme\TightVNC\vncviewer.exe
1 Datei(en) kopiert

Ich denke mir aber, dass das komfortabler gehen müsste. Ich habe via Google ein Tool gesucht, das meine Dateiliste mit kompletten Pfadangaben in eine Filebox einliest, in einem Eingabefeld Modifikationen am Pfad erlaubt (mache "\\NAS2\" aus "\\NAS1\") und dann einen Kopiervorgang mit allen Pfadangaben startet. Leider habe ich nichts passendes gefunden; meist resultierte eine "flatten"-Aktion, d.h., alle Dateien aus allen Unterverzeichnissen landeten genau in einem Zielverzeichnis, wobei gleichnamige Dateien aus unterschiedlichen Unterverzeichnissen sich gegenseitig wild überschrieben. Fehlanzeige.

Der TC kann z. B. über den Suchdialog aus dem Dateisystem offenbar beliebige Listen ins Dateifenster laden, indem die Suchergebnisse mit der Schaltfläche "anwenden" ins Dateifenster geladen werden; eine Möglichkeit, eine Textdatei als Basis für die Dateiliste zu verwenden, besteht offenbar nicht. Damit hätte man schon mal eine Ausgangsbasis. Wenn man die - ersatzweise via Suchdialog gewonnene - Dateiliste kopiert, macht die darauffolgende Kopieraktion aber wieder die Ordnerstruktur platt ("flatten"): alle Dateien landen im aktiven Ordner im Zielfenster, die Unterordnerstruktur wird nicht repliziert.

Damit ich meinem Ziel mit dem TC näher kommen könnte, müsste ich:
1) eine Möglichkeit haben, die Dateiliste (Quelle) aus meiner Textdatei zu füllen und
2) eine Kopieraktion finden, die nicht nur die Dateien, sondern auch die Ordnerstruktur übernimmt.

Was passieren soll, ist also:
\\NAS1\extra\lw_y\Programme\TightVNC\vncviewer.exe => \\NAS2\extra\lw_y\Programme\TightVNC\vncviewer.exe
\\NAS1\public\SHELL32.icl => \\NAS2\public\SHELL32.icl
\\NAS1\video\multimedia\Queen\Queen - Love of My Life.flv => \\NAS2\video\multimedia\Queen\Queen - Love of My Life.flv

Weiß jemand, wie man den Total Commander zu so einer Aktion überreden kann? Oder kennt jemand ein anderes Tool, das - so ähnlich wie das TC-Mehrfach-Umbenenn-Tool - Suchen und Ersetzen-Funktionalität für Pfadanteile bietet? (1: suche in jedem Dateinamen im Zielfenster nach "\\NAS1\" und ersetze dies mit "\\NAS2\"; 2: kopiere dann die Datei aus dem Quellfenster in das in Schritt 1 definierte Verzeichnis)

Für diesbezügliche Tipps wäre ich sehr dankbar.

Beste Grüße,
t.rauner
User avatar
Dalai
Power Member
Power Member
Posts: 8247
Joined: 2005-01-28, 22:17 UTC
Location: Meiningen (Südthüringen)

Post by *Dalai »

Wenn die alten Sicherungskopien in der ersten Verzeichnisebene zu finden sind, dann markiere alle Verzeichnisse mit Strg+A (oder Num*) und deselektiere diejenigen Verzeichnisse, die du nicht haben willst. Dann rufst du die Funktion "Verzeichnisse synchronisieren" auf und legst los; andererseits genügt dann auch ein normales Kopieren.

Wenn die alten Sicherungskopien Dateien bestimmter Typen sind, die sich nicht in den gewünschten Verzeichnissen finden, so lässt sich das ebenfalls mit der Verzeichnissynchronisierung machen. Funktion aufrufen, Dateitypen in der mittleren Box einstellen - z.B.

Code: Select all

*.* | *.nicht_gewünscht *.auch_nicht_gewünscht
und los geht's.

Wenn keine der beiden Bedingungen zutrifft, wird's aufwendiger für dich. Es wäre aber schön und IMO wichtig, wenn du erstmal kundtun würdest, wo sich die Verzeichnisse befinden, die nicht transferiert werden sollen (tief irgendwo in der Struktur oder in der ersten Ebene). Anhand dieser Info kann man sich Gedanken machen.

MfG Dalai
#101164 Personal licence
Ryzen 5 2600, 16 GiB RAM, ASUS Prime X370-A, Win7 x64

Plugins: Services2, Startups, CertificateInfo - Download-Mirror
User avatar
t.rauner
Junior Member
Junior Member
Posts: 13
Joined: 2012-07-01, 00:10 UTC
Location: Sulzbach-Rosenberg, Germany

Re:Dateiliste aus lokaler Textdatei einlesen?

Post by *t.rauner »

Hallo Dalai,

vielen Dank für Deine prompte Antwort. Leider ist es nicht so einfach, wie in Deinen zwei Lösungen beschrieben. Stelle Dir einfach ein typisches Dokumentenverzeichnis von MS Word vor (es geht aber nicht nur um Word-Dokumente, sondern um eine wilde Mixtur eines Familien-NAS). Da hast Du z. B. auf einer Verzeichnisebene folgende Situation:

Brief an Versicherung - Entwurf 01.doc
Brief an Versicherung - Entwurf 01.wbk
Brief an Versicherung mit Anmerkungen - Entwurf 02.doc
Brief an Versicherung mit Anmerkungen - Entwurf 02.wbk

Brief an Versicherung - Endfassung.doc
Brief an Versicherung - Endfassung.wbk


Das, was nun auf NAS1 (dem "Live-NAS") gespeichert war und bleiben soll, sind die "beiden Endfassungen" - also Original-Word-Dokument und dessen Sicherheitskopie. Die Entwürfe sind via Backup auf NAS2 gelandet, sollen dort zu Referenzzwecken auch bleiben, aber auf NAS1 wurden sie gelöscht, um den Überblick zu behalten.

Das Ganze stelle Dir nun nicht nur im Word-Dokumentenverzeichnis vor, sondern auch im Excel-Tabellenverzeichnis, im Rechnungsordner, im Download-Ordner (alte Download-Versionen neben aktuellen auf NAS2, auf NAS1 nur die aktuellen Versionen) u.v.a.m., und zwar in unterschiedlichen Verzeichnisebenen. Ich hoffe, dass damit klar ist, dass NAS2 eine Obermenge von Dateien aus NAS1 enthält, und zwar:
  • - die nahezu gleiche Ordnerstruktur (auf NAS2 evtl. zusätzliche Backup-Verzeichnisse, die auf NAS1 nicht mehr existieren)
    - die Unterschiede in der Ordnerstruktur beziehen sich nur auf den Pfadbeginn (z. B. "\\NAS2\backup\" statt "\\NAS1\")
    - die unerwünschten zusätzlichen Dateien liegen i. d. R. auf der gleichen Verzeichnisebene, wie die erwünschten, zurück-zu-kopierenden Dateien
Habe ich mich klar genug ausgedrückt? Ansonsten bitte nachfragen :?

Deine Antwort scheint mir aber auch schon eine Bestätigung dessen zu sein, was ich vermute: Es gibt keine Möglichkeit in Total Commander, die Quell-Dateiliste (z. B. linkes Dateipanel) statt über Suchfunktion o. ä. über das Einlesen einer (gefilterten) Liste zu befüllen, richtig?

Bin für jeden weiteren Tipp dankbar!

Beste Grüße,

Thomas
Last edited by t.rauner on 2012-07-01, 20:30 UTC, edited 1 time in total.
User avatar
HolgerK
Power Member
Power Member
Posts: 5369
Joined: 2006-01-26, 22:15 UTC
Location: Europe, Aachen

Re: Dateiliste aus lokaler Textdatei einlesen?

Post by *HolgerK »

t.rauner wrote:...
wurde:
\extra\lw_y\Programme\TightVNC\vncviewer.exe
\public\SHELL32.icl
\video\multimedia\Queen\Queen - Love of My Life.flv
...
Mal überlegen. Du hast also eine Dateiliste, in der alle Dateien des alten NAS1 aufgelistet sind.

- Im NAS2 Rootverzeichnis "Befehle-> Zweigansicht (mit Unterverzeichnissen)" aktivieren.
- "Markieren -> Auswahl aus Datei laden" aufrufen und diese Liste auswählen.
- "Markieren -> Auswahl umkehren"
- "Markieren -> Auswahl in Datei speichern"
Damit solltest du eine zweite Liste erhalten in der alle Dateien, die vorher bereits auf dem NAS2 waren, enthalten sind.
- Diese Liste dann als Ignorierliste laden: "Konfigurieren -> Einstellungen..:Ignorierliste [>>]"
- Ignorierliste aktivieren.
- Von NAS2 auf das neue NAS1 synchronisieren oder einfach kopieren.
- Die alte Ignorierliste wiederherstellen.

Gruß
Holger
User avatar
Dalai
Power Member
Power Member
Posts: 8247
Joined: 2005-01-28, 22:17 UTC
Location: Meiningen (Südthüringen)

Post by *Dalai »

@HolgerK: Die Idee ist prinzipiell gut, nur funktioniert sie nicht, denn in der mit "dir" erstellten Dateiliste sind mehr oder minder absolute Pfade, die sich leider nicht auf eine Zweigansicht anwenden lassen (hatte ich gestern als erstes probiert). Damit funktionieren auch alle folgenden Schritte nicht.

Selbst wenn der erste Schritt noch funktionierte, so sind in der mit "dir" erstellten Liste wahrscheinlich Umlaute als ASCII gespeichert und sind somit vom TC nicht ohne weiteren Zwischenschritt als solche erkennbar (jedenfalls nicht fürs Laden einer Markierung aus einer Datei).

Insofern bleibt aus meiner Sicht nur noch eine Schleife übrig, die man entweder in Batch oder AutoIt oder meinetwegen auch AutoHotkey implementieren kann.

MfG Dalai
#101164 Personal licence
Ryzen 5 2600, 16 GiB RAM, ASUS Prime X370-A, Win7 x64

Plugins: Services2, Startups, CertificateInfo - Download-Mirror
algol
Senior Member
Senior Member
Posts: 420
Joined: 2007-07-31, 14:45 UTC

Re: Dateiliste aus lokaler Textdatei einlesen?

Post by *algol »

HolgerK wrote:- "Markieren -> Auswahl aus Datei laden" aufrufen und diese Liste auswählen.
Hallo Holger,

ein kühner Ansatz!

Aber ob's auch klappt? Ich fürchte nämlich, ich hatte so eine ähnliche Idee auch schon mal, und ich glaube, mich dunkel daran zu erinnern, dass ich dabei feststellen musste, dass in der <Ctrl>B-Ansicht dann nur die Dateien unmittelbar aus dem <Ctrl>B-"Mutterverzeichnis" markiert werden, nicht aber diejenigen Dateien mit qualifizierter Pfadangabe, die in Wahrheit in Unterverzeichnissen stehen.

Umgekehrt wird ohne <Ctrl>B-Ansicht aber auch keine verzeichnisübergreifende Markierung geladen.

Ich kann mich irren und hoffe, ich tue es, aber..

mfg
algol
algol
Senior Member
Senior Member
Posts: 420
Joined: 2007-07-31, 14:45 UTC

Post by *algol »

Dalai wrote:Insofern bleibt aus meiner Sicht nur noch eine Schleife übrig, die man entweder in Batch oder AutoIt oder meinetwegen auch AutoHotkey implementieren kann.
Es sei denn, "t.rauner" fände eine sinnvolle zeitliche Trennlinie zwischen den obsoleten Alt-Beständen und den aktuellen Dateien, die er nun zurücksichern möchte.

Oder er hätte "Pech im Unglück" und die Kopien nicht mit dem Originaldatum erzeugt. Dann könnte man sie anhand des Kopierdatums zwar bequem zurückkopieren, aber es wäre bloss ein "Pyrrussieg", denn die Original-Zeitstempel wären dann verloren.

mfg
algol
algol
Senior Member
Senior Member
Posts: 420
Joined: 2007-07-31, 14:45 UTC

Post by *algol »

Da kommt mir gerade ein Gedanke! Was haltet ihr davon?

Liste ins MRT mit Editor laden.

Vor den Qualifizierten Pfad jeweils einen neuen Parent-Orner setzen. Also:

\\#MOVENAS1\alter_Pfad

und dann "umbenennen". Das sollte doch alle Dateien aus der Liste auf NAS2 relativ verschieben.

Dann mit <Alt><F7> nur die #MOVENAS1-Strukturen suchen und die Treffer mit <Shift>"Anwenden" in ein neues Panel legen, dort alle markieren und nach "NAS1" kopieren.

Auf NAS1 wieder umbenennen und die Dateien relativ 1 Ebene "höhersetzen", sodass "#MOVENAS1" wieder verschwindet.

Ist natürlich auch nicht wirklich elegant, aber wäre es wert, diesen Ansatz weiterzuverfolgen?

mfg
algol
User avatar
Dalai
Power Member
Power Member
Posts: 8247
Joined: 2005-01-28, 22:17 UTC
Location: Meiningen (Südthüringen)

Post by *Dalai »

@algol: Auch hier bleiben Umlaute ein Problem.

Ich hab mal etwas - basierend auf der vom OP bereits geposteten Schleife - in Batch gebastelt:

Code: Select all

@echo off

REM -----------------------------------------------------------------
REM Dateiliste aus lokaler Textdatei einlesen?
REM http://ghisler.ch/board/viewtopic.php?t=34901
REM -----------------------------------------------------------------

echo.

for /F "delims=" %%i IN (NAS1.lst) DO (
    echo "\\NAS2%%~i" ==^> "\\NAS1%%~i"
    REM xcopy /S /E /H /R /D /Y /I "\\NAS2%%~i" "\\NAS1%%~i" > NUL
)
Das abspeichern als z.B. filelist_copy.cmd, in einer separat aufgerufenen CMD (im TC über Menü Befehle > Kommandozeilenfenster öffnen) ausführen und erstmal durchgucken, ob's passt. Die Datei NAS1.lst muss sich dabei im selben Arbeitsverzeichnis liegen (sonst Pfad anpassen).

Da die Ausgabe sehr schnell durchlaufen wird, sollte man diese in eine Datei umleiten und sich dort anschauen. Wenn die Ausgabe in Ordnung ist, kann man zur Tat schreiten und das REM vor dem xcopy entfernen.

MfG Dalai
#101164 Personal licence
Ryzen 5 2600, 16 GiB RAM, ASUS Prime X370-A, Win7 x64

Plugins: Services2, Startups, CertificateInfo - Download-Mirror
algol
Senior Member
Senior Member
Posts: 420
Joined: 2007-07-31, 14:45 UTC

Post by *algol »

Kommandos zurück!! Manchmal ist man aber auch wirklich vernagelt!

Es geht ganz einfach! Suche <Alt><F7> auf NAS2 (root) starten, Feld "Suche nach" freilassen (suche nach allen Dateien),

in Feld "Suche in" einfach mit vorangestelltem "@" die Dateiliste (mit Pfad) eingeben und Suche starten.

Es werden nun genau die Dateien "gefunden", die in der Liste stehen. Bisher hatte ich das nur mit Listen probiert, die lediglich zu durchsuchende Verzeichnisse enthielten, weil es mir irgendwie paradox vorkam, nach Dateien zu "suchen", die schon konkret in der Liste standen.

Ich hab's aber soeben mit einer Mini-Liste inklusive Dateinamen ausprobiert - und... es geht!

"Suchergebnis" dann einfach mit <Shift>"Anwenden" in ein neues Fenster/Panel legen, alles markieren und mit Hilfe des TC-Plugins "TreeCopyPlus 1.051" mit <Alt><F5>in das gegenüberliegende Fenster, voreingestellt auf \ (root) von NAS1 zurück-kopieren.

Link zum Plugin:http://www.totalcmd.net/download.php?id=TreeCopyPlus

Der Umweg über die "Suche" gestattet also tatsächlich, die Datei-Liste aus dem txt-file in ein gleichlautendes TC-Fenster mit den entsprechenden, konkreten Dateien umzusetzen!

HTH und mfg
algol
User avatar
Dalai
Power Member
Power Member
Posts: 8247
Joined: 2005-01-28, 22:17 UTC
Location: Meiningen (Südthüringen)

Post by *Dalai »

Hier noch eine Variante in AutoIt, die etwas aufwendiger aussieht, im Wesentlichen aber dasselbe tut wie die Batch-Version:

Code: Select all

global const $name = "NAS1.lst"

global $liste = FileOpen($name, 0)
global $line, $source, $target

while 1
    $line = FileReadLine($liste)
    if @error == -1 then ExitLoop
    $source = "\\NAS2" & $line
    $target = "\\NAS1" & $line
    ConsoleWrite(StringFormat("%s ==> %s", $source, $target) & @CRLF)
    $source = ASCII2ANSI($source)
    $target = ASCII2ANSI($target)
;~    MsgBox(0, "", StringFormat("%s ==> %s", $source, $target))
;    if NOT FileCopy($source, $target, 9) then ConsoleWrite(" Error!")
WEnd
FileClose($liste)


;------------------ Convert ASCII string into ANSI string -------------
Func ASCII2ANSI($str_ascii)
    local $ascii= $str_ascii, $dummy, $result, $iError

    $result = DllCall("user32.dll", "int", "OemToChar", "str", $ascii, "str", $dummy)
    $iError = @error
    if $iError <> 0 then
        SetError($iError)
        Return $str_ascii
    Else
        Return $result[2]
    EndIf
EndFunc
Code kopieren, abspeichern als filelist_copy.au3, mit Aut2Exe aus dem AutoIt-Paket in eine EXE konvertieren - wichtig dabei: Haken bei "Console?" setzen! Dann die erzeugte EXE auf einer CMD starten und ggf. Ausgabe in Datei umleiten.

Wenn Ausgabe in Ordnung, Semikolon in der Zeile mit "FileCopy" entfernen, neu kompilieren und starten.

MfG Dalai
#101164 Personal licence
Ryzen 5 2600, 16 GiB RAM, ASUS Prime X370-A, Win7 x64

Plugins: Services2, Startups, CertificateInfo - Download-Mirror
algol
Senior Member
Senior Member
Posts: 420
Joined: 2007-07-31, 14:45 UTC

Post by *algol »

Dalai wrote:@algol: Auch hier bleiben Umlaute ein Problem.
Also das würde ich vorweg im Editor überprüfen und allenfalls bereinigen.

Z.B. "Ultraedit" aber auch andere Editoren können automatisch Textdateien von ASCII nach ANSI oder auch OEM bzw. UTF-8 / Unicode hin- und herwandeln. Das scheint mir also kein echter "deal-breker" zu sein.
algol
Senior Member
Senior Member
Posts: 420
Joined: 2007-07-31, 14:45 UTC

Post by *algol »

Dalai wrote:Code kopieren, abspeichern als filelist_copy.au3, mit Aut2Exe aus dem AutoIt-Paket in eine EXE konvertieren - wichtig dabei: Haken bei "Console?" setzen! Dann die erzeugte EXE auf einer CMD starten und ggf. Ausgabe in Datei umleiten.
Denkst Du nicht, dass meine neue "Express-Methode" derart komplexe Ansätze eigentlich erübrigt?

Schade nur, dass ich nicht eher auf diese Idee gekommen bin, dann hätten wir nicht so lange über die "mühsamen Wege" nachdenken müssen :?

mfg
algol
User avatar
Dalai
Power Member
Power Member
Posts: 8247
Joined: 2005-01-28, 22:17 UTC
Location: Meiningen (Südthüringen)

Post by *Dalai »

algol wrote:
Dalai wrote:@algol: Auch hier bleiben Umlaute ein Problem.
Also das würde ich vorweg im Editor überprüfen und allenfalls bereinigen.
Dito. Aber dafür muss man erstmal wissen, dass das ein Problem ist, denn MS hat es auch im Jahre 2012 noch nicht hinbekommen, dass die CMD im ANSI-Modus arbeitet, auch dann nicht, wenn man ihr das mit entsprechendem Parameter sagt :roll:. Ich wollte mit meiner Anmerkung nur auf das Problem aufmerksam machen, so dass der OP entsprechend handelt und sich nicht später wundert, warum Dateien mit Umlauten fehlen oder falsche Dateinamen haben.
algol wrote:Denkst Du nicht, dass meine neue "Express-Methode" derart komplexe Ansätze eigentlich erübrigt?
Nope, denn davon abgesehen, dass wir unsere Erkenntnisse fast zeitgleich kundtaten :), funktioniert deine Methode erst ab TC 8.0 und nicht mit früheren Versionen. Meine Varianten sind zudem völlig unabhängig von TC. Ich will deine Methode keineswegs in Abrede stellen, beide haben ihre Berechtigung - und sicher ist es über den TC einfacher (und das Kopieren geht wahrscheinlich sogar schneller). Vielleicht findet es jemand hilfreich, der via Suchmaschine auf das Thema stößt oder sowas.

MfG Dalai
#101164 Personal licence
Ryzen 5 2600, 16 GiB RAM, ASUS Prime X370-A, Win7 x64

Plugins: Services2, Startups, CertificateInfo - Download-Mirror
algol
Senior Member
Senior Member
Posts: 420
Joined: 2007-07-31, 14:45 UTC

Post by *algol »

Dalai wrote:Nope, denn davon abgesehen, dass wir unsere Erkenntnisse fast zeitgleich kundtaten :), funktioniert deine Methode erst ab TC 8.0 und nicht mit früheren Versionen. Meine Varianten sind zudem völlig unabhängig von TC.
Hallo Dalai,

nachdem Du Dir mit dieser aufwendigen Batch-Lösung soviel Mühe gemacht hast und ich noch dazu unfähig war, Dir diese Mühe zu ersparen, weil ich so lange "den Wald vor lauter Bäumen nicht gesehen habe", liegt mir nichts ferner, als Deine Lösung in irgendeiner Form herabwürdigen oder kleinreden zu wollen.

Auch der berechtigte Hinweis auf die Umlaut-Frage war natürlich mehr als angebracht, betrifft er doch unser beider Lösungen. Aber, auch wenn ich lange "etwas auf der Leitung gestanden bin", letztendlich zählt, dass wir es beide geschafft haben, obwohl das Problem sich als weniger trivial herausgestellt hat, als es zunächst klingen mochte. 8)

Glückwunsch und mfg
algol
Post Reply