2009-05-13 10 views
4

Tout le monde connaît un utilitaire de ligne de commande (ou un utilitaire qui peut fonctionner comme une ligne de commande) qui va collecter tous les fichiers .jpg dans un répertoire en un seul dossier, seulement copier les fichiers qui changent?Copier une arborescence de répertoires dans un seul répertoire sur une ligne de commande

J'ai commencé avec Renamer, ce qui est génial pour renommer des fichiers dans leurs répertoires actuels, mais il est tombé court quand j'ai essayé de modifier le chemin. C'est probablement parce que je ne connais pas très bien Renamer. J'ai fini par créer un vidage de répertoire de fichiers texte, puis en utilisant un outil de recherche/remplacement REGEX pour créer un fichier batch, mais cela n'est guère efficace ni automatisé.

Le REGEX:

(G: \ DIR \ DIR \) ([0-9] + \) ([0-9] + \) ([0-9] + \) ([0 -9] + \) (p [0-9] + jpg)

a changé cette

G:. \ DIR \ DIR \ 00 \ 00 \ 00 \ 00 \ p0000000000.jpg

à ce

G: \ DIR \ DIR \ p0000000000.jpg

(copy \ 1 \ 2 \ 3 \ 4 \ 5 \ 6 \ 1 \ 6) dans le fichier batch.

Je dois exécuter le tout comme une tâche planifiée sans une vraie personne se connectant. Pas vraiment à la recherche d'un fichier Zip parce que je ne veux pas déranger le processeur du système, plus la plupart des fichiers ne changeront pas jour après jour. C'est plus d'une synchronisation de fichier.

+0

Cela vous dérangerait d'ajuster la question car elle ne correspond pas vraiment à l'intention de votre message. Je cherchais de l'aide pour récursivement copier des dossiers sur Windows en ligne de commande à la recherche de "Windows Copy Tree" et votre message était considéré comme le meilleur résultat en raison du titre, bien que ce soit un problème plus spécifique ... pour copyring tree en tant que tel: utilisez 'xcopy/s/i srcdir dstdir' ... – cepharum

Répondre

7

Dans une ligne de commande Windows, vous pouvez le faire:

for /R A %i IN (*.jpg) DO xcopy %i B /M /Y 

Où A est le répertoire source et B est le répertoire de destination. Vous devez activer les extensions de commande, ce qui est la valeur par défaut.

+0

Est-ce que cela ne fait que copier les fichiers qui changent? Cela semble être la partie délicate. – CoderDennis

+0

Réponse fantastique. –

+0

@Dennis Palmer - Dans mon édition j'ai changé la copie en xcopy avec/M./M copie uniquement les fichiers avec l'ensemble d'attributs d'archive et supprime l'attribut arcive du fichier d'origine. Lorsque le fichier change, l'attribut archive doit être réappliqué par Windows. –

0

Dans un environnement Unix, j'utiliserais find ou rsync (et peut-être certaines fonctionnalités du shell). Cygwin et MinGW viennent avec find, peut-être avec rsync. Vous pouvez également obtenir un port autonome de find pour Windows quelque part.

Si la variable shell SOURCE est le répertoire contenant les sous-répertoires des fichiers à copier, et la variable shell DEST est le répertoire pour les copier:

find $SOURCE -name \*.jpg -exec cp --update \{\} $DEST/ \; 

find est par nature récursive. "-name \*.jpg" sélectionne les fichiers correspondant à ce modèle. Vous pouvez ajouter des conditions supplémentaires avec -et. L'option --update de la commande cp (ou -u) ne dérange que la copie du fichier si elle a été modifiée ou pas encore copiée. Il y a d'autres options à cp qui pourraient être utiles aussi.Si $ SOURCE est identique à $ DEST comme dans votre exemple DIR/DIR /, alors vous trouverez également les fichiers de destination (déjà copiés), bien que ce soit OK, cp reconnaîtra que vous essayez de copier le même fichier à lui-même et l'ignorer, mais si vous voulez éviter ce travail inutile, vous pouvez utiliser 'for' et 'if' (ou quelque chose) pour exécuter find uniquement dans les sous-répertoires de DIR/DIR /.

Vous pouvez également utiliser rsync, qui contient des options permettant de supprimer des fichiers du répertoire de destination s'ils ont également été supprimés du répertoire source, ainsi que de nombreuses autres variantes.

Questions connexes