2009-09-17 13 views
0

Comment écrivez-vous cela en n'ayant que des fichiers batch et VBScript à votre disposition dans un environnement Windows?"cp --parents" dans le fichier batch/VBScript

find -name '*.ext' -exec cp --parents {} destination/ \; 

Ou mettre ainsi:

  • Rechercher récursive dans le dossier en cours pour un motif de fichiers (se terminant par une extension appelée ext dans l'exemple ci-dessus),
  • Copie chacun de ces fichiers vers un dossier de destination (où que ce soit) conservant la structure de l'arborescence de répertoires (ou créant des répertoires intermédiaires manquants) comme dans le dossier actuel.

Répondre

2

Cela devrait fonctionner:

for /r %%a in (*.cmd) do xcopy %%a C:\DESTINATION%%~pa 

Notez que DESTINATION devrait jamais être un sous-répertoire du répertoire que vous essayez de copier, sinon for /r va dans une copie de la boucle récursive les fichiers qu'il a déjà copié en créant des chemins de répertoire plus longs et plus longs (ne me demandez pas comment je sais).

Vous pouvez le rendre légèrement plus robuste en utilisant xcopy /c (pour continuer la copie même si des erreurs surviennent). Vous pouvez également regarder xcopy /? pour voir s'il y a quelque chose d'autre de valeur là (/q, /r, /o, etc.).

+0

Il finira par s'arrêter une fois que les chemins atteignent 32k caractères :-) – Joey

+0

+1 Fonctionne comme un charme, Grant! Seuls les idiots mettraient une référence circulaire dans la destination, non? LOL. – mjv

+0

Ca marche plutôt bien (presque là), merci Grant! Mais l'arborescence de répertoires créée dans la destination est en réalité le chemin absolu du (des) fichier (s). Est-il possible de créer uniquement un chemin relatif pour cela? – Ali

0

Edit: Mon mauvais, j'ai manqué le drapeau --parents dans la commande cp ... xcopy comme indiqué ci-dessous sera uniquement recréée le chemin vers le bas, et non pas celle des répertoires « ci-dessus » répertoire courant.

I [maintenant] croient xcopy serait [pas] faire l'affaire [seul. Mais fonctionne à merveille avec le truc "for/r" de Grant Wagner.

xcopy [some_path]*.ext [some_otherpath]\final_directory /E 

(or /S, above, if you don't want empty directories) 
the elements within brackets, some_path and some_otherpath are optional 
+0

Comment précisément s'il vous plaît? J'ai essayé avec les options/t et/i, mais cela n'a pas diminué. – Ali

+0

'/ T' crée uniquement la structure du répertoire mais ne copie rien, alors que'/I' modifie simplement la sémantique de la cible. Je suppose que vous voudriez le drapeau '/ S'. Donc quelque chose du genre 'xcopy * .ext destination/S' – Joey

+0

/s fonctionnerait du haut vers le bas, n'est-ce pas? J'ai besoin de copier uniquement les fichiers avec le modèle donné et leur arborescence de répertoires. C'est exactement ce que fait la commande bash. Pour mieux comprendre cela, imaginez avoir des milliers de différents types de fichiers dans le dossier actuel, mais vous n'avez besoin que de ceux spécifiques. – Ali