2010-11-04 2 views

Répondre

13

XCOPY est conçu pour fonctionner avec des listes 'ne comprennent pas' ... Voir ci-dessous:

dir /b /a-d "source"|findstr /b "aaa" >"%temp%\aaafiles.tmp" 

    xcopy "source" "destination\" /exclude:%temp%\aaafiles.tmp /y 

La première ligne exécute une liste (répertoire) DIR du dossier source, répertorier les fichiers au format nu (/b) en ignorant les noms de répertoire (/ad). La sortie est redirigée vers la commande FINDSTR.

FINDSTR regarde chaque nom de fichier et la compare commence (/b) avec la chaîne "aaa ".

Si le début d'un nom de fichier correspond à la chaîne « aaa », le nom du fichier est redirigée (écrit) dans le fichier aaafiles.tmp dans les utilisateurs répertoire TEMP.

Le /b est essentiel parce que vous ne voulez pas exclure des fichiers tels que theaaafile.txt.

Les XCOPY dossier copie les fichiers de commande de la source dans le dossier de destination sauf les fichiers répertoriés dans aaafiles.tmp.

L'invite pour remplacer les fichiers existants (/y) est désactivée.

source et la destination devra être remplacée par vos propres noms de répertoire.

+0

excellente solution! merci – eze1981

+2

Il s'agit d'une copie de fichier, pas un mouvement. Avec des fichiers volumineux, une copie peut être extrêmement lente alors qu'un déplacement sur le même volume est presque instantané. – Adisak

+0

Note: J'ai trouvé aussi l'option '/ S' (affichage récursif du contenu du répertoire) utile. – Antonio

4

Une façon vous pouvez le faire est de créer une liste des fichiers à se déplacer dans un temporaire fichier. Ensuite, utilisez le fichier avec la commande for. Générez la liste en utilisant findstr.

> dir/b/a-d | findstr /v aaa* > "%temp%\@movelist" 
> for /f %f in (%temp%\@movelist) do move %f ... 

La première commande obtient une liste de tous les fichiers (sans répertoires) dans le répertoire courant, puis canalise la liste à findstr qui exclut (/v) les noms de fichiers qui correspondent au modèle et il met dans le fichier @movelist dans le répertoire temporaire. La deuxième commande prend juste ces résultats afin que vous puissiez faire ce que vous voulez avec eux (le déplacer).

Il y a probablement une meilleure façon de le faire en une seule commande sans le fichier temporaire, je ne sais pas comment l'écrire. Je ne sais pas comment appeler la commande dir à partir de la commande for. Je pense que cela ne prend que des fichiers programme qui existent, pas de commandes intégrées.

2

Si cela ne vous dérange pas de manipuler le bit d'archive, vous pouvez l'utiliser pour copier et supprimer sélectivement des fichiers en fonction d'un masque de fichier.

Déplacer (copier et supprimer) tous les fichiers sauf ceux commençant par "aaa" du répertoire courant vers "dest". Peut également spécifier le chemin d'accès complet à la source.

attrib +a *.* 
attrib -a aaa*.* 
xcopy /a [or /m] *.* dest 
del /aa /q *.* 
2

Dans certains cas, il peut être rendu plus simple. Par exemple, je devais copier récursivement un tas de répertoires mais à l'exclusion de toutes les images (png et bmp), donc je simplement créé un fichier excludeList.txt contenant:

.png 
.bmp 

et exécuter

xcopy /S /I <source> <dest> /exclude:c:\excludeList.txt 

Il sera correspondre à n'importe quel fichier ou répertoire contenant.png, mais pas nécessairement se terminant par par .png. (Je n'ai pas cherché à savoir si une utilisation intelligente des caractères génériques ou des expressions régulières est possible). Il ne gère pas votre exemple particulier (pour lequel vous avez déjà une bonne réponse) mais il a résolu mon problème, et cette page est ce que j'ai trouvé quand j'ai recherché une solution :)

Questions connexes