Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
GELÖST

Dateien aus Unterverzeichnissen verschieben

Frage Entwicklung Batch & Shell

Mitglied: JamesBond8811

JamesBond8811 (Level 1) - Jetzt verbinden

30.06.2007, aktualisiert 25.07.2007, 14941 Aufrufe, 12 Kommentare

Trotz einiger gefundener Hinweise komme ich nicht klar

Hallo zusammen,

ich habe ein übergeordnetes Verzeichnis A, in dem sich untergeordnete Verzeichnisse B bis Z befinden. In jedem der untergeordneten Verzeichnisse befinden sich eine oder mehrere Dateien.

Ich möchte eine Batch-Datei erstellen, mit deren Hilfe ich alle Dateien aus den Unterverzeichnissen B bis Z in das übergeordnete Verzeichnis A verschieben kann. Idealerweise sollen die Unterverzeichnisse anschließend gelöscht werden.

Habe versucht, eine Batch-Datei zu erstellen, wie es hier von Biber beschrieben ist:
http://www.administrator.de/frage/per-batch-dateien-aus-unterordner-in- ...

Wenn ich dann die Datei ausführe, kriege ich die Fehlermeldung "Das System kann den angegebenen Pfad nicht finden". Wahrscheinlich ist der Dateiname von mir nicht korrekt angegeben worden (etwas mit der Syntax?).

Wäre froh, wenn jemand mir als einem blutigem Anfänger den Vorgang Schritt für Schritt erklären könnte.

P.S. Spielt es eine Rolle, wenn Dateinamen Leerzeichen haben?
Mitglied: Tire
30.06.2007 um 20:55 Uhr
hi,
also so wie ich das hier vestehe, kanst du auch einfach im überordner A alle anderen ordner auswählen(<strg>+<a>) und dann im gewünschten verzeichnis einfach wieder einfügen!
oder nicht?

mfg
tire
ps. ja es spiel oft ein rolle, wenn dateinamen ein leerzeichen haben!
Bitte warten ..
Mitglied: JamesBond8811
30.06.2007 um 22:47 Uhr
hi,
also so wie ich das hier vestehe, kanst du
auch einfach im überordner A alle
anderen ordner
auswählen(<strg>+<a>) und
dann im gewünschten verzeichnis einfach
wieder einfügen!
oder nicht?

mfg
tire

Hallo, nein, leider nicht.
Ich möchte ja nicht Unterordner verschieben, sondern Dateien, die darin enthalten sind. Unterordner selbst sollen anschließend gelöscht werden.
Bitte warten ..
Mitglied: bastla
01.07.2007 um 09:31 Uhr
Hallo JamesBond8811 und willkommen im Forum!

Deine Aufgabe ist aber trotzdem über den Explorer zu lösen, indem Du vom Ordner A aus eine "Suche" nach allen Dateien (also ohne etwa Teile des Dateinamens oder -inhaltes anzugeben ) durchführst, das Ergebnis nach der Spalte "Im Ordner" sortierst, die in den Unterordnern gefundenen Dateien markierst, ausschneidest und in den Ordner A einfügst. Das Löschen der Unterordner müsste dann gleichfalls "von Hand" erfolgen.
Da Du aber nach einer Batch-Lösung gefragt hast, ein Vorschlag, den Du unmittelbar an der Kommandozeile verwenden kannst:
01.
for /d %i in ("D:\A\*.*") do @move /-y "%i\*.*" "D:\A" & @dir /s /a-d "%i">nul 2>nul || rd /s /q "%i"
Das D:\A entspricht Deinem angegebenen Beispielsverzeichnis A und muss natürlich entsprechend geändert werden. Falls Du die Zeile nicht am Prompt, sondern tatsächlich als Batch verwenden willst, ist jedes %i durch ein %%i zu ersetzen.

Vorweg eine Warnung: Diese Zeile wird Dateien verschieben und Verzeichnisse löschen, also zuerst auf Testdaten oder eine Kopie anwenden!

Zwei Anmerkungen:

Wie immer beim Verschieben/Kopieren von Dateien musst Du vorweg überlegen, was passieren soll, wenn eine Datei gleichen Namens bereits im Zielverzeichnis vorhanden ist. Der "move"-Befehl (zum Verschieben) fragt Dich in diesem Fall (aus Sicherheitsgründen verwende ich den Schalter "/-y") jeweils, ob einmal (diese Datei), diesmal nicht oder immer (bei diesem "move", also für dieses Verzeichnis) überschrieben werden soll.

Es werden auch wunschgemäß die "leeren" Verzeichnisse gelöscht, wobei ich "leer" so definiere, dass weder das Verzeichnis selbst, noch eines seiner Unterverzeichnisse (falls überhaupt vorhanden) noch eine Datei enthält - dann wird allerdings ohne Rückfrage das Verzeichnis inklusive aller Unterverzeichnisse entfernt.

Informationen zu den verwendeten Befehlen erhältst Du, indem Du zB "for /?" oder "help for" eingibst.

Erklärungsbedürftig könnte der zweite Teil der Zeile (nach dem "&", mit dem man mehrere Befehle verknüpfen kann) sein:
Um festzustellen, ob ein Verzeichnis oder dessen Unterverzeichnisse Dateien enthalten, wird der "dir"-Befehl mit den Schaltern "/s" (durchsuche auch Unterverzeichnisse) und "/a-d" (berücksichtige dabei aber nur Dateien) verwendet.

Da nur das Gesamtergebnis interessiert, wird die Ausgabe der gefundenen Dateien (mit ">nul") und die Fehlermeldung, wenn ein Verzeichnis keine Dateien enthält (mit "2>nul") ins "Nichts" umgeleitet.

Falls tatsächlich keine Dateien gefunden wurden, wird der "dir"-Befehl selbst mit einem Fehlercode ("Errorlevel") von 1 beendet.

Damit nur in diesem Fall der nachfolgende Befehl zum Entfernen des Verzeichnisses (mit "rd") samt aller Unterverzeichnisse ("/s") ohne Rückfrage ("/q") ausgeführt wird (die Anzeige der einzelnen Löschbefehle habe ich übrigens zur Kontrolle bewusst nicht durch ein vorangestelltes @ unterdrückt), erfolgt eine "bedingte Verknüpfung" mit "||".

Diese bewirkt, dass nur, wenn der vorige Befehl nicht fehlerfrei (mit Errorlevel 0) beendet wurde, der nachfolgende Befehl ausgeführt wird - daher nochmals konkret: Nur, wenn der "dir"-Befehl keine Dateien gefunden hat (und daher einen Fehler meldet), wird das Verzeichnis gelöscht. (Anmerkung: Das Gegenstück zu "||" ist "&&" - damit wird der folgende Befehl nur ausgeführt, wenn der vorhergehende Befehl fehlerfrei abgeschlossen wurde.)

Abschließend noch zu Deiner Frage nach den Leerstellen in Dateinamen: Das Leerzeichen wird als Trennzeichen interpretiert und würde einen Datei- (und natürlich auch Verzeichnis-) Namen "zerschneiden". Um das zu verhindern, müssen solche Namen (oder ganze Pfade, in denen zumindest eine Leerstelle enthalten ist) in Anführungszeichen eingeschlossen werden. Bei dem oben als Beispiel verwendeten Verzeichnis "D:\A" wäre dies zwar nicht erforderlich, da es aber auch nicht schadet, setze ich die Anführungszeichen mittlerweile schon gewohnheitsmäßig.

Grüße
bastla
Bitte warten ..
Mitglied: JamesBond8811
01.07.2007 um 15:26 Uhr
Hallo bastla,

vielen Dank für die ausführliche Anleitung!

Der Tipp mit dem Windows-Explorer ist in der Tat sehr gut. Jedoch hat manchmal Dateien, die ganz unterschiedliche Namen und Erweiterungen haben, so dass mir dann eine Batch-Lösung besser erscheint.

Werde sie ausprobieren und von meinen Ergebnissen berichten.

Grüße
JamesBond8811
Bitte warten ..
Mitglied: Biber
10.07.2007 um 21:00 Uhr
Moin JamesBond8811,
> Werde sie ausprobieren und von meinen Ergebnissen berichten.

Nachfrage: Gibt es denn schon erste Zwischenergebnisse?

Grüße
Biber
Bitte warten ..
Mitglied: JamesBond8811
11.07.2007 um 16:23 Uhr
Moin JamesBond8811,
> Werde sie ausprobieren und von meinen
Ergebnissen berichten.

Nachfrage: Gibt es denn schon erste
Zwischenergebnisse?

Grüße
Biber

Hallo Biber,

den konkreten Fall konnte ich mit Hilfe von Windows-Explorer lösen, da alle Dateien die gleiche Endung hatten.

Ich habe aber auch die Eingabe über die Kommandozeile versucht, doch es will nicht so richtig klappen. Wahrscheinlich liegt es daran, dass ich von der Sache nur ganz wenig Ahnung habe.

Also, ich habe folgendes gemacht:

1) cmd.exe aufgerufen.
Da erscheint: C:\WINDOWS\system32>

2) ich kopiere

for /d %i in ("D:\A\*.*") do @Move /-y "%i\*.*" "D:\A" & @dir /s /a-d "%i">nul 2>nul || rd /s /q "%i"

(Verzeichnisse entsprechend angepasst) in die Zwischenablage und füge es über STR. + V in die Kommandozeile ein. Drücke auf Enter. Kommandozeile verschwindet, doch es passiert nichts.

Was mache ich falsch?
Bitte warten ..
Mitglied: Biber
25.07.2007 um 20:21 Uhr
Ganz, ganz sorry, JamesBond8811,

ich hatte Deine Antwort erst eben gelesen.

Kann auch nicht mal sofort sagen, was bei Dir der Klemmer ist.

Ich habe eben noch mal folgenden Proof-of-Concept gemacht:
[Bei mir am CMD-Prompt im Verzeichnis D:\temp, sollte aber auch in "D:\A" fliegen]
(=20:17:46 D:\temp=)
>echo ttt>d:\temp\zwei\test.ttt
[in einem Unterverzeichnis meiner Arbeitsebene eine Datei mit der Endung "*.ttt" anlegen.]
> for /d %i in ("D:\temp\*") do @if exist "%i\*.ttt" echo move /-y "%i\*.ttt" d:\temp
move "D:\temp\zwei\*.ttt" d:\temp
[Simulation des MOVEns]
(=20:18:02 D:\temp=)
> for /d %i in ("D:\temp\*") do @if exist "%i\*.ttt" move /-y "%i\*.ttt" d:\temp
Syntaxfehler.

(=20:18:22 D:\temp=)
> for /d %i in ("D:\temp\*") do @if exist "%i\*.ttt" move /y "%i\*.ttt" d:\temp
D:\temp\zwei\test.ttt


Wie Du siehst, war der doppelt gemoppelte Move-Schalter "/-y" das Problem.
Ein einfaches "/y" bringt eine um vielfaches effizientere Variante.

Grüße
Biber
Bitte warten ..
Mitglied: bastla
25.07.2007 um 20:46 Uhr
@Biber

Das "move /-y" hatte ja ich verbrochen, allerdings aus gutem Grund:

Beim Testen vom Prompt wurde bei "move" ohne "/y", wie zu erwarten, nach dem Überschreiben vorhandener Dateien gefragt, bei Verwendung in einem Batch allerdings nicht - daher zur Vorsicht die explizite Formulierung "/-y", die bei mir auch funktioniert - sowohl im Batch als auch von der Kommandozeile.

Den Syntaxfehler aus Deinem Beispiel erhalte ich übrigens auch nicht:
01.
<D:\temp>echo ttt>d:\temp\zwei\test.ttt 
02.
 
03.
<D:\temp>for /d %i in ("D:\temp\*") do @if exist "%i\*.ttt" echo move /-y "%i\*.ttt" d:\temp 
04.
move /-y "D:\temp\zwei\*.ttt" d:\temp 
05.
 
06.
<D:\temp>for /d %i in ("D:\temp\*") do @if exist "%i\*.ttt" move /-y "%i\*.ttt" d:\temp 
07.
D:\temp\zwei\test.ttt 
08.
 
09.
<D:\temp>dir /s /b 
10.
D:\temp\test.ttt 
11.
D:\temp\zwei
Grüße
bastla

P.S.: Dateiversion der cmd.exe: 5.1.2600.2180 (xpsp_sp2_rtm.040803-2158)
Bitte warten ..
Mitglied: Biber
25.07.2007 um 21:19 Uhr
@bastla
Das ist in der Tat skurril...bei "nochm-Test" folgendes Verhalten:
>(=21:12:49 D:\temp=)
> for /d %i in ("D:\temp\*") do @if exist "%i\*.ttt" move /-y "%i\*.ttt" d:\temp

d:\temp\test.ttt überschreiben? (Ja/Nein/Alle):

Also "/-y" als doppelte Negation interpretiert????
01.
 >filever /v %comspec% 
02.
--a-- W32i   APP DEU   5.1.2600.2180 shp    401,408 08-04-2004 cmd.exe 
03.
        Language        0x0407 (Deutsch (Deutschland)) 
04.
        CharSet         0x04b0 Unicode 
05.
        OleSelfRegister Disabled 
06.
        CompanyName     Microsoft Corporation 
07.
        FileDescription Windows-Befehlsprozessor 
08.
        InternalName    cmd 
09.
        OriginalFilenam Cmd.Exe 
10.
        ProductName     Betriebssystem Microsoft« Windows« 
11.
        ProductVersion  5.1.2600.2180 
12.
        FileVersion     5.1.2600.2180 (xpsp_sp2_rtm.040803-2158) 
13.
        LegalCopyright  ® Microsoft Corporation. Alle Rechte vorbehalten. 
14.
 
15.
        VS_FIXEDFILEINFO: 
16.
        Signature:      feef04bd 
17.
        Struc Ver:      00010000 
18.
        FileVer:        00050001:0a280884 (5.1:2600.2180) 
19.
        ProdVer:        00050001:0a280884 (5.1:2600.2180) 
20.
        FlagMask:       0000003f 
21.
        Flags:          00000000 
22.
        OS:             00040004 NT Win32 
23.
        FileType:       00000001 App 
24.
        SubType:        00000000 
25.
        FileDate:       00000000:00000000
Drex-Windows...*gg

Grüße
Biber
Bitte warten ..
Mitglied: bastla
25.07.2007 um 21:36 Uhr
@Biber

Also "/-y" als doppelte Negation interpretiert????
Eigentlich nur verneinte Bejahung (also: "auf keinen Fall ohne Rückfrage überschreiben") ...

Aber das viel seltsamere ist das Verhalten in Batch - früher hatte ich das offensichtlich nie so genau getestet (bzw ohnehin "/y" verwendet), daher war ich über das kommentarlose Überschreiben auch ohne "/y" entsprechend erstaunt und habe dann zur "Sicherheitsvariante" gegriffen ...

Grüße
bastla
Bitte warten ..
Mitglied: Biber
25.07.2007 um 21:45 Uhr
Ach sooooooo, bastla,

dann wird es eine gesetzte Umgebungsvariable COPYCMD bei Dir sein. Obwohl....?*grübel*

Es steht orakelhaft in COPY /? bzw. auch MOVE /?.

Die Option /Y ist in der COPYCMD-Umgebungsvariablen eventuell voreingestellt.
Dies kann durch die Option /-Y außer Kraft gesetzt werden. Standardmäßig
müssen Sie das Überschreiben von Dateien bestätigen, es sei denn der MOVE-
Befehl wird von einem Batchprogramm aus aufgerufen.


Die ist so grottig implementiert (wie auch %DIRCMD% btw), dass ich dazu mal fast ein Mini-Tut geschrieben hätte.

Spiel mal mit gesetzten %DIRCMD% und DIR-Parametern ein bisschen am Prompt herum, dann siehst Du, was ich meine...


Grüße
Biber
Bitte warten ..
Mitglied: bastla
25.07.2007 um 22:01 Uhr
@Biber

Gar nicht nötig:
Standardmäßig müssen Sie das Überschreiben von Dateien bestätigen, es sei denn der MOVE-
Befehl wird von einem Batchprogramm aus aufgerufen.


Hätte ich jemals so weit gelesen, wäre mein Staunen unnötig gewesen - genau dieses Verhalten habe ich allerdings mit "/-y" auf "unbedingt vor dem Überschreiben nachfragen" abgeändert (insofern, um Dich zu zitieren, works as designed).

Konsequenz daraus: Bei der nächsten einschlägigen Batchdatei wieder 2 Zeichen eingespart ...
Da wäre dann eigentlich nur noch das Problem von JamesBond8811 ...

Vielleicht geht es ja wirklich ohne den Schalter besser, also (von der Kommandozeile):
01.
for /d %i in ("D:\A\*.*") do move "%i\*.*" "D:\A\" & @dir /s /a-d "%i">nul 2>nul || rd /s /q "%i"
Obwohl - so recht daran glauben kann ich eigentlich nicht ...

@JamesBond8811: Ich habe zum Testen das "@" vor dem "move" entfernt, damit die "move"-Befehle angezeigt werden - so kannst Du besser erkennen was abläuft (bzw wenn sich nix tut).

Grüße
bastla

P.S.: In solchen Situationen bedauere ich die fehlende Gelenkigkeit, um mir in den A.... beißen zu können.
Bitte warten ..
Neuester Wissensbeitrag
Windows 10

Powershell 5 BSOD

(8)

Tipp von agowa338 zum Thema Windows 10 ...

Heiß diskutierte Inhalte
Microsoft
Ordner mit LW-Buchstaben versehen und benennen (21)

Frage von Xaero1982 zum Thema Microsoft ...

Netzwerkmanagement
gelöst Anregungen, kleiner Betrieb, IT-Umgebung (18)

Frage von Unwichtig zum Thema Netzwerkmanagement ...

Windows Update
Treiberinstallation durch Windows Update läßt sich nicht verhindern (14)

Frage von liquidbase zum Thema Windows Update ...

DSL, VDSL
Problem mit variernder Internetgeschwindigkeit (12)

Frage von schaurian zum Thema DSL, VDSL ...