Ich habe eine große Anzahl von Dateien (über 45.000) in einer ziemlich komplexen Ordnerstruktur. Ich habe eine Teilmenge von ~13.000 Dateien und deren Pfade (relativ zum Stammordner) extrahiert, die ich mit dem ursprünglichen Ordnerpfad kopieren möchte.
Obwohl ich gründlich gesucht habe, konnte ich mit xcopy oder robocopy keine Möglichkeit finden, das zu tun, was ich möchte. Ich könnte problemlos eine Batchdatei mit einem Kopierbefehl für jeden Eintrag in meiner Liste erstellen. Ich konnte jedoch keinen x/robocopy-Schalter oder keine Schalterkombinationen finden, die den Ordnerpfad im Ziel aus meiner Quelldatei generieren, z. B.:
xcopy dir1\dir2\dir3\file.txt copy_folder /<some switches>
oder
xcopy dir1\dir2\dir3\file.txt copy_folder\dir1\dir2\dir3\file.txt /<some switches>
Ich möchte, dass der Pfad erstellt wird, dir1\dir2\dir3
wenn er nicht unter dem Ordner existiert copy_folder
, und dort eine Kopie davon abgelegt wird file.txt
. Ich verstehe das, unter Linux cp --parent
passiert genau das.
Jeder Vorschlag, wie dies am besten erreicht werden kann, ist herzlich willkommen!
Antwort1
XCOPY erstellt die Ordner, wenn sie nicht vorhanden sind, fragt aber zuerst, ob das Ziel eine Datei oder ein Verzeichnis ist.
Sie können die F-Antwort also an den XCOPY-Befehl weiterleiten, sodass der Befehl nicht angehalten wird.
for /f "delims=" %%F in (yourList.txt) do echo f 2>nul | xcopy /y "%%~F" "copyFolder\%%~F"
Die /Y
Option wird verwendet, wenn Ihre Liste Duplikate enthält – Sie möchten nicht, dass der Befehl XCOPY Sie fragt, ob Sie überschreiben möchten.
Die Umleitung von stderr auf nul ist erforderlich, falls der Pfad vorhanden ist. In diesem Fall kann die rechte Seite vor der linken abgeschlossen werden, was dazu führt, dass die linke Seite die folgende Fehlermeldung auf stderr ausgibt – The process tried to write to a nonexistent pipe.
Die Umleitung verbirgt die unerwünschte Fehlermeldung.
Eine andere Möglichkeit besteht darin, vor dem Ausführen von XCOPY zuerst den Zielpfad zu erstellen. Leiten Sie stderr einfach auf null um, um eine Fehlermeldung zu vermeiden, wenn der Pfad bereits vorhanden ist.
for /f "delims=" %%F in (yourList.txt) do (
md "copyFolder%%~pF" 2>nul
xcopy /y "%%~F" "copyFolder\%%~F"
)
Wenn der Pfad in Ihrer Liste bei beiden Lösungen einen Laufwerksbuchstaben enthält, müssen Sie
"copyFolder%%~pnxF"
anstelle von verwenden "copyFolder\%%~F"
. Beachten Sie, dass der ~p
Modifikator das führende umfasst \
.