Copierea mai multor foldere la o singură destinație cu robocopy (Administrarea sistemului, Powershell, Scp, Regex, Robocopy)

SDGuero a intrebat.

Caut o soluție pentru a utiliza robocopy pentru a copia mai multe foldere dintr-un director pe o partajare de rețea îndepărtată. Vreau să aleg mai multe foldere dintr-un director care conține sute de foldere care nu mă interesează. Vreau să fac ceva similar cu scp în linux folosind regex, dar acest lucru nu funcționează în robocopy:

c:robocopy "c:results1319_TC1.*" "\datastoresomefolder

6 răspunsuri
wullxz

Încearcă asta:

gci C:results1319_TC1.* | foreach-object { robocopy $_.fullname (".datastoresomefolder
+ $_.name) }

gci C:results1319_TC1.* obține mai întâi toate fișierele/directoarele care se potrivesc și le pune prin conducta unde foreach-object are grijă de toate rezultatele de la prima comandă. Se va roboci calea completă a fiecărui rezultat (calea completă către directoarele de rezultate) și le va pune în .datastoresomefolder cu numele original al folderului, de ex:
C:results1319_TC1.123456 -> C:resultsdatastoresomefolder1319_TC1.123456

Chestia aia între paranteze va pune împreună acel nume de director-țintă și numele de dosar original.

Editați:
Tocmai am văzut că directorul-țintă ar trebui să fie un traseu UNC. Robocopy acceptă UNC-path-uri (chiar și cu nume de căi mai lungi de 256 de caractere). Trebuie doar să înlocuiți (".datastoresomefolder
cu ("\datastoresomefolder
în comanda mea. Așadar, comanda corectă ar fi:

gci C:results1319_TC1.* | foreach-object { robocopy $_.fullname ("\datastoresomefolder
+ $_.name) }

KCotreau

Ai face-o într-un fișier batch. Veți avea nevoie de o linie pentru fiecare director.

Ca alternativă, ați putea face acest lucru, care ar copia totul și apoi ar șterge excesul, dacă este mai ușor: Robocopy z:directory d:directory /MIR /COPYALL (Atenție: MIR înseamnă imagine în oglindă și va suprascrie tot ceea ce se află în calea sa, așa că folosiți-l numai pe un director gol).

James

Nu veți putea face acest lucru doar cu Robocopy. Dacă aveți acces la o mașină linux, ar fi foarte ușor de realizat folosind find cu aplicația -exec opțiunea. Sau ai putea folosi cygwin pe Windows (bănuiesc că are comanda find), sau ai putea folosi un limbaj de scripting precum Ruby sau Python pe Windows.

Comentarii

  • Linux sau cygwin nu sunt necesare, deoarece are acces la powershell, care este capabil să folosească regex. Cu toate acestea, acest lucru ar funcționa… –  > Por wullxz.
  • Da, bineînțeles că acestea nu sunt singurele opțiuni, dar ar fi cele mai bune alegeri ale mele. –  > Por James.
  • Da, fiecare cu gustul său 🙂 –  > Por wullxz.
Nate

Un powershell rapid ca acesta:

$Dir = get-childitem "c:results
  -recurse
$List = $Dir | where {$_.FullName -match "1319_TC1."}
$List | split-path FullName -parent | get-unique

Vă va oferi o listă cu toate fișierele care se află într-un dosar care se potrivește cu „1319_TC1”. Apoi, tot ce trebuie să faceți robocopy fiecare dintre aceste dosare.

R. Rozis

Mergeți cu următoarele:

for /d %d in (c:results1319_TC1.*) do robocopy "%d" "\datastoresomefolder%~nxd" /E /W:0 /R:0 /XO /XJ

Aici folosim comanda Windows for cu un /d swith pentru a trece în buclă peste toate directoarele din 1319_TC1.* iar comanda for ar stoca pentru fiecare nume de director, calea completă c:results1319_TC1.* .. unul câte unul în variabila %d.

Cu ajutorul comenzii %~nxd separăm numele și extensia folderului din întreaga cale și îl transmitem lui robocopy pentru a ne asigura că aceleași foldere sunt create la destinația de \datastoresomefolder.

Alegeți comutatoarele robocopy după gustul dumneavoastră.

La for vă permite să introduceți și să transmiteți nume explicite către o altă comandă, robocopy în acest caz. Iată un exemplu de copiere a profilurilor de utilizator ale john și paul către comanda datastore. Mă duc în folderul sursă cd c:users mai întâi pentru a lista numele dosarelor sursă fără numele căilor de acces complete:

cd c:users
for /d %d in (john,paul) do  robocopy "%d" "\datastoresomefolder%d" /E /W:0 /R:0 /XO /XJ

Tzalumen

Știu că acesta este un răspuns la o întrebare veche de 6 ani, dar toate răspunsurile anterioare au fost kludges. Din moment ce acesta este rezultatul de top în google, m-am gândit să prezint soluția corectă la întrebarea specifică.

c:robocopy "c:results1319_TC1.*" "\datastoresomefolder

Nu puteți selecta mai multe directoare sursă. Cu toate acestea, directoarele sunt fișiere.

Dacă aveți o structură de .folder1folder3, .folder1folder4, și .folder2

Sintaxa corectă pentru a copia folderul3 și folderul4 în folderul2 cu robocopy este:

robocopy folder1 folder2 folder* /e

unde /e va muta toate directoarele.

Aici devine interesant. Pentru a controla ce directoare sunt copiate, nu includeți o listă sau un wildcard pentru a le alege pe cele pe care doriți să le copiați, ci folosiți /XD și folosiți o listă sau un wildcard pentru a le exclude pe cele pe care nu doriți să le copiați.