julia1989
Goto Top

Alle Dateien eines Typs in Unterordnern in ein anderes Verzeichnis kopieren, aber so, dass sie in einem einzigen Unterverzeichnis liegen

Hallo, ich habe folgendes Problem:

Ich habe viele *.php dateien, diese liegen in jeweils verschiedenen Unternordnern also C:\PfadZumOberverzeichnis\{A bis n}\ und mit ein paar Unterordnern, manchmal 2 manchmal 5 also \..\..\..\..\n\*.php - Ich möchte nun, dass
1. alle php Dateien aus dem allen Unterordnern NACH A\ gesucht werden und in das Verzeichnis \{A-n}\php kopiert werden (ich muss sie online hochladen, deswegen der Aufwand).

Wunderbar wäre es auch noch, wenn ich dann später die Dateien auch wieder per Batch oder Powershell-Script zurückkopieren könnte. also aus irgendeinem Ordner soll er
1. in allen (oben) vorhandenen Unterordnern ..\{A bis n}\(ab hier also\..\..\ suchen, ob eine Datei mit gleichem Namen vorhanden ist und diese dann ohne Rückfrage ersetzen.

Ich weiß, dass ich irgendwie dafür for Schleifen brauche, und Variablen festlegen muss. Wie kann ich denn unbestimmte Ordnerhierarchien festlegen? also \X\..\..\..\{A bis n} ist jetzt Variable irgendwas?

es ist relativ wichtig - wenn jemand eine gute Idee dazu hat, wäre ich ihm/ihr sehr verbunden.

Liebe Grüße an alle


PS:\{A bis n} steht nur für den Ordner, in dem die ganzen Unterverzeichnisse anfangen. Alles was ÜBER diesem Ordner ist, braucht nicht durchsucht zu werden.

Content-Key: 562653

Url: https://administrator.de/contentid/562653

Printed on: April 19, 2024 at 17:04 o'clock

Mitglied: 143728
143728 Apr 02, 2020 updated at 13:18:24 (UTC)
Goto Top
Robocopy reicht in dem Fall völlig...
robocopy "QUELLE" "ZIEL" *.php /s /w:1 /r:1  

(ich muss sie online hochladen, deswegen der Aufwand).
Man könnte ja auch einfach winscp mit dem "synchronize" Befehl nehmen dann wäre ein extra umkopieren überflüssig.
Member: Julia1989
Julia1989 Apr 02, 2020 at 13:22:49 (UTC)
Goto Top
das geht leider nicht, weil es ein webformular ist, nicht auf einen Server. Ich probiere gleich robocopy mal aus, das wäre natürlich super wenn das gehen würde. /s /w:1 /r:1 - was bedeuten die parameter? und schon mal danke für die ganz schnelle hilfe
Mitglied: 143728
143728 Apr 02, 2020 updated at 13:25:22 (UTC)
Goto Top
Zitat von @Julia1989:
/s /w:1 /r:1 - was bedeuten die parameter?
Öh, den Link von oben lesen kannst du nicht, da stehts ?!

/s 	Copies subdirectories. Note that this option excludes empty directories.
/r:<N> 	Specifies the number of retries on failed copies. The default value of N is 1,000,000 (one million retries).
/w:<N> 	Specifies the wait time between retries, in seconds. The default value of N is 30 (wait time 30 seconds).
usw....
Member: Pjordorf
Pjordorf Apr 02, 2020 at 13:28:19 (UTC)
Goto Top
Hallo,

Zitat von @Julia1989:
das geht leider nicht, weil es ein webformular ist, nicht auf einen Server. Ich probiere gleich robocopy mal aus, das wäre natürlich super wenn das gehen würde. /s /w:1 /r:1 - was bedeuten die parameter? und schon mal danke für die ganz schnelle hilfe
Mal ein Robocopy /? in einer Komandozeile gemacht? Wirkt Wiunder...

Gruß,
Peter
Member: Julia1989
Julia1989 Apr 02, 2020 at 13:46:11 (UTC)
Goto Top
nein das hatte ich wohl wirklich eben übersehen. Ich habe noch ein anderes Problem, der Befehl funktioniert soweit erstmal. Das Problem ist, dass er dann die Struktur Ordner\Unterordner\..... auch im Ziel benutzt. Gibt es einen befehl, so das Kopieren AUS einer Hierarchie IN einen Ordner ohne Hieracrchie funktioniert? ich hatte schon in anderen Foren geschaut und ich hatte noch keine zufriedenstellende Lösung gefunden. Dem Rat von Pjordorf folgend habe ich mir mal die Hilfe von Robocopy angesehen und leider noch nichts gefunden.
Mitglied: 143728
143728 Apr 02, 2020 updated at 14:15:31 (UTC)
Goto Top
Zitat von @Julia1989:
Das Problem ist, dass er dann die Struktur Ordner\Unterordner\..... auch im Ziel benutzt.

Dann solltest du auch gleich richtig fragen und nicht so:
Alle Dateien eines Typs in Unterordnern in ein anderes Verzeichnis kopieren, aber so, dass die Verzeichnisstruktur erhalten bleibt

Gibt es einen befehl, so das Kopieren AUS einer Hierarchie IN einen Ordner ohne Hieracrchie funktioniert?
Logo, Powershell z.B. so
ls "C:\Quelle" -Filter *.php -File -recurse | copy-item -destination "C:\Ziel" -verbose -Force  
Klar sollte dir aber hierbei sein das es bei Dateien mit dem selben Namen gezwungenermaßen zu Konflikten kommt wenn diese alle in einem Ordner landen sollen!
Member: Julia1989
Julia1989 Apr 02, 2020 at 13:55:18 (UTC)
Goto Top
ok, das wäre meine nächste frage. Es soll so aussehen: X:\A\1\2\3 -> Dateien *.php X:\A\php

mit PowerShell kenne ich mich so gar nicht aus, daher bin ich übrigens auch sehr dankbar, dass hier wirklich im Minutentakt geantwortet wird. Ich korrigiere den Fragetext, da hatte ich mich vertan.
Member: manuel-r
manuel-r Apr 02, 2020 at 13:55:19 (UTC)
Goto Top
Klar sollte dir aber hierbei sein das es bei Dateien mit dem selben Namen gezwungenermaßen zu Konflikten kommt wenn diese alle in einem Ordner landen sollen!

Und, dass es beim zurück kopieren nicht wieder in die alte Hierarchie zurück geht. Denn woher soll das entsprechende Tool wissen in welchem Ordner eine Datei früher mal war?!
Member: Xerebus
Xerebus Apr 02, 2020 at 14:07:05 (UTC)
Goto Top
Ich glaub ja es wäre prinzipiell nicht schlecht zu wissen was sie genau vor hat face-smile
Dann wäre die Lösung, die dann auch funktioniert sicher nicht so weit weg.
Member: Julia1989
Julia1989 Apr 02, 2020 at 14:09:41 (UTC)
Goto Top
das wäre dann der nächste Schritt. Ich hatte mir das so vorgestellt: Suche nach dem entsprechenden Dateinamen, in ALLEN Verzeichnissen \1\2\3 und sobald du einen treffer hast, ersetze diesen mit der ersten Datei, die du im Ziel (vom ersten Kopiervorgang) X:\A\php findest. A ist eine Variable, es gibt also A bis X, aber jede Datei die INNERHALB ihres Buchstabens liegt, kommt auch nur einmal vor.
Mitglied: 143728
143728 Apr 02, 2020 updated at 14:17:07 (UTC)
Goto Top
Zitat von @Julia1989:

ok, das wäre meine nächste frage. Es soll so aussehen: X:\A\1\2\3 -> Dateien *.php X:\A\php
Code oben hast du übersehen?? Der macht das schon so wie du willst.
mit PowerShell kenne ich mich so gar nicht aus
Dann wirds Zeit sich damit auseinanderzusetzen.

Vielleicht erst mal genau nachdenken was du wirklich willst und dann erst schreiben.
Member: Julia1989
Julia1989 Apr 02, 2020 at 14:14:20 (UTC)
Goto Top
gern. Ich muss einfach die Dateien online auf eine Webseite hochladen, da werden sie gepatcht, und auswählen kann ich leider keine ganzen Ordner, sondern nur die Dateien - durch einen klassischen "Öffnen" Button, wo ich dann alle Dateien markieren kann. Ich hatte natürlich erst an eine Windows suche gedacht, das würde aber dazu führen, dass ich in dem Fall DOCH mehrere gleiche Namen hätte, weil index.php gibt es z.B nur einmal in Ordner A und den Unterordern 1,2,3.... etc, aber in B gäbe es auch eine index.php. Das heißt, ich kann leider nicht einfach alle Dateien auf einen Haufen über den Explorer zusammenkopieren und da es sich um knapp 100 Verzeichnisse handelt und auch in Zukunft so etwas anstehen wird, wäre eine generelle Lösung dafür recht hilfreich. Die hochgeladenen Dateien erhalte ich als ZIP zurück, ohne Hierarchie - da wäre ein automatisches kopieren zwar hilfreich, aber nicht so wichtig, wie das sortieren fürs hochladen. Das könnte ich dann noch händisch machen zur not.
Member: Julia1989
Julia1989 Apr 02, 2020 at 15:18:10 (UTC)
Goto Top
der Powershell befehl von oben funktioniert NICHT. Ich möchte Powershell sagen, dass der Name des Ordners C:\Users\x\Desktop\Hauptordner\UNTERORDNER\..\..\..\ dem Pfad C:\Users\x\Desktop\Hauptordner angefügt wird - also C.\Users\x\Desktop\x\Desktop\Hauptordner\Unterordner(n-fach)\php

wie kann ich das definieren? ich habe mich schon etwas belesen und viel gefunden zu dem Thema, aber die möglichkeit, eine bestimmte Stelle als Variable zu nehmen habe ich nicht gefunden. Ich hatte $x und $_ versucht, hatte aber nicht geklappt!
Member: Pjordorf
Pjordorf Apr 02, 2020 at 15:35:26 (UTC)
Goto Top
Hallo,

Zitat von @Julia1989:
wie kann ich das definieren? ich habe mich schon etwas belesen und viel gefunden zu dem Thema, aber die möglichkeit, eine bestimmte Stelle als Variable zu nehmen habe ich nicht gefunden. Ich hatte $x und $_ versucht, hatte aber nicht geklappt!
https://www.script-example.com/powershell-basics

Gruß,
Peter
Member: Julia1989
Julia1989 Apr 02, 2020 at 16:00:15 (UTC)
Goto Top
Danke sehr, könnte mir trotzdem jemand helfen? ich hatte mir das jetzt so gedacht.

Das 1. Verzeichnis habe ich schon hinbekommen mit $quelle="C:\Users\Julia\Desktop\X\";
dann hatte ich versucht, diese zweite Variable über das Ergebnis der ersten Variable zu definieren $name="Get-ChildItem -Path $quelle";
das scheint leider nicht zu klappen.

Kann mir jemand die Lösung verraten? Ich bin auch ein Mensch, der sich gerne alles selbst beibringt und ich sehe schon, ich habe Powershell-Scripting doch sehr vernachlässigt, aber im Moment bräuchte ich einfach die Lösungface-smile

Ich hatte mir das so gedacht, dass EIN EINZIGER ORDNER (mit beliebigem Namen) also C:\a\b\c\d\e\$X\f\g eine Variable sein könnte..... wie hat das auszusehen? ich hatte mir die Seite, die Peter eben geschickt hatte auch natürlich etwas genauer angesehen aber die Lösung noch nicht gefunden.
Mitglied: 143728
143728 Apr 02, 2020 updated at 16:56:57 (UTC)
Goto Top
Zitat von @Julia1989:

der Powershell befehl von oben funktioniert NICHT. Ich möchte Powershell sagen, dass der Name des Ordners C:\Users\x\Desktop\Hauptordner\UNTERORDNER\..\..\..\ dem Pfad C:\Users\x\Desktop\Hauptordner angefügt wird - also C.\Users\x\Desktop\x\Desktop\Hauptordner\Unterordner(n-fach)\php
Sorry aber du schwenkst dauernd hin und her!! Erst soll alles mit der originalen Ordner-Struktur in den anderen Ordner (was übrigens Robocopy bereits hervorragend erledigt), dann willst du erneut das alles aus den Unterordnern flach in einen einzigen Ordner kopiert werden soll, und jetzt wieder das erste?? Entscheide dich bitte !! Das gewünschte macht dir bereits der Robocopy Befehl und da ist nichts weiter nötig.

Wenn du das Robocopy mit der PS simulieren willst geht das nat. auch, ist aber je eigentlich nicht nötig
$quelle = "c:\Quelle"  
$ziel = "c:\Ziel\php"  
if (!(Test-Path $ziel)){md $ziel -Force | out-null}
ls $quelle -Filter *.php -File -recurse | %{
    $t = $_.DirectoryName -replace [regex]::Escape($quelle),$ziel
    if(!(Test-Path $t)){md $t -Force | out-null}
    $_ | copy-item -Destination $t -verbose
}
Member: Julia1989
Julia1989 Apr 02, 2020 at 17:31:33 (UTC)
Goto Top
ich sehe schon irgendwie erkläre ich wohl heute sehr schlecht. es gibt ja einen haufen quellen und einen haufen ziele.

c:\quelleA\ordner1{php1}\ordner2{php2} {Die dateien liegen in Ordner1 und/oder Ordner2} >> c:\qelleA\php (hier soll alles rein, was vorher in ordner 1 und 2 war und php dateien hat\
c:\quelleB\ordner1\{php3}ordner2{php4} {Die dateien liegen in Ordner1 und/oder Ordner2} >>c:\qelleB\php (hier soll alles rein, was vorher in ordner 1 und 2 war und php dateien hat\
c:\quelleC\ordner1{php5}\ordner2{php6} {Die dateien liegen in Ordner1 und/oder Ordner2} >>c:\qelleC\php (hier soll alles rein, was vorher in ordner 1 und 2 war und php dateien hat\

Das Ergebnis wäre dann
c:\qelleA\php{php1,php2}
c:\qelleA\php{php3,php4}
c:\qelleA\php{php5,php6}

Quelle und Ziel sind der selbe Ordner, es geht eben nur darum, in den UNTERORDNERN aufzuräumen. Wie nennt man so etwas genau?
Member: Julia1989
Julia1989 Apr 02, 2020 at 19:04:22 (UTC)
Goto Top
ich fühle, dass ich der Lösung schon ganz nahe bin. Was meint ihr?

$quelle = @("C:\Users\Julia\Desktop\X");
$name = Get-ChildItem -Name "C:\Users\Julia\Desktop\X\";
echo $name;
[array]$namever = @(foreach ($name in $name){
"C:\Users\Julia\Desktop\VTEExtensionencoded\" + "$name" + '\php\'
});
echo $namever;
ls "C:\Users\Julia\Desktop\VTEExtensionencoded\" -Filter *.php -File -recurse | copy-item -Destination "$namever" -verbose -Force
Mitglied: 143728
143728 Apr 02, 2020 updated at 19:11:21 (UTC)
Goto Top
Alter man kann sich auch einen abbrechen mit der Erklärung .... da ist der Corona-Virus ja noch harmlos dagegen
$quellen = 'c:\quelleA','c:\quelleB','c:\quelleC'  
foreach($quelle in $quellen){
    ls $quelle -dir -exclude php | %{
       ls $_.Fullname -recurse -Filter *.php | copy-item -Destination "$($quelle.Fullname)\php" -verbose  
    }
}
Member: Pjordorf
Pjordorf Apr 02, 2020 at 20:33:19 (UTC)
Goto Top
Hallo,

Zitat von @Julia1989:
ich fühle, dass ich der Lösung schon ganz nahe bin. Was meint ihr?
Hast du wenigstens eine gute und funktionelle Datensicherung? Und Robocopy kann dir gar die eine Datei die du auf deine Platte hast unter den anderen 10 Millionen Dateien finden und kopieren. Einfach mal mit beschäftigen. Und Bedenke für was der Name steht "Robust File Copy" siehe auch mal hier https://en.wikipedia.org/wiki/Robocopy oder gar hier https://docs.microsoft.com/en-us/windows-server/administration/windows-c ...

Den Parameter /L solltest du dir angewönen sowie /Log: oder /Log+:

Gruß,
Peter
Member: Julia1989
Julia1989 Apr 03, 2020 at 09:18:46 (UTC)
Goto Top
ich habe zu dem <$quellen/code> noch eine Frage. Ich habe da 83 verzeichnisse in der Wurzel. Er soll einfach alle Verzeichnisse, die er findet in die Variable quellen schreiben. das sind eben leider nicht nur A B und C. wie kann er damit umgehen? ansonsten Danke, ich denke, das wird das sein wo nach ich gesucht habe. Bitte nicht so stürmisch, bei mir war es schon nachts um drei, (andere Zeitzone) da denkt man nicht mehr klar. Pjordorf - ja ich habe mehrere Backups von allen Daten sowie auf mehrere physische Geräte verteilt (andere Festplatte intern), NAS im RAID-Modus.... man hängt ja an seinem digitalen Leben. Und ja - ihr alle (nicht nur die beiden genannten) haben mir vor Augen geführt, wie mächtig doch Powershell und die Konsole allgemein ist, ich war bis jetzt eher ein GUI-Freak, bis ich merkte, dass man so nicht immer weiterkommt. Jetzt in der Kriese habe ich ja Zeit mich weiterzubilden.
Mitglied: 143728
Solution 143728 Apr 03, 2020 updated at 11:39:21 (UTC)
Goto Top
ls "c:\Wurzel" -Dir | %{  
    $dest = "$($_.Fullname)\php"  
    if(!(Test-Path $dest)){md $dest -force | out-null}
    ls $_.Fullname -dir -exclude php | %{   
       ls $_.Fullname -recurse -Filter *.php -File | copy-item -Destination $dest -verbose
    }
}

So dat war es von meiner Seite.

Tschö und blivet jesund.

#edit# typo's korrigiert.
Member: Julia1989
Julia1989 Apr 03, 2020 at 11:06:17 (UTC)
Goto Top
ok, er versteht leider das php nur als datei, nicht als Ordner und schreibt alles in den dateinamen "php".
Member: AnkhMorpork
AnkhMorpork Apr 03, 2020 at 11:13:01 (UTC)
Goto Top
<OT>
An dieser Stelle möchte ich meinen Respekt denjenigen zeugen, welche den Eingangspost verstanden haben!
</OT>
Mitglied: 143728
143728 Apr 03, 2020 at 11:26:41 (UTC)
Goto Top
Zitat von @Julia1989:

ok, er versteht leider das php nur als datei, nicht als Ordner und schreibt alles in den dateinamen "php".
War nur ein Typo, wurde getestet geht hier einwandfrei ...
Member: Julia1989
Julia1989 Apr 04, 2020 updated at 10:21:15 (UTC)
Goto Top
Zitat von @AnkhMorpork:

<OT>
An dieser Stelle möchte ich meinen Respekt denjenigen zeugen, welche den Eingangspost verstanden haben!
</OT>

ich auch, das Problem ist, dass ich schlecht erklären konnte was ich wollteface-smile deswegen auch ein ganz großes Danke an alle, die mir weitergeholfen haben - eine super Leistung! ich muss noch mal sehen, wo bei mir denn der Fehler ist, denn davon gehe ich auch aus. Wenn alle es probieren und es bei anderen geht, dann wird es ja nicht an euch liegen!

EDIT: Ja, es klappt jetzt bei mir einwandfrei! ich hoffe, ich kann mich irgendwann mal revanchierenface-smile