Копирование файлов с подстановочными знаками в пути - PullRequest
23 голосов
/ 22 декабря 2011

Предположим, что существует структура каталогов C: \ users \ myuser \ Desktop \ bob \ marley.

В Windows из начального каталога C: \ users \ myuser \ Desktop я могу сделать "cd bo *\ mar * "и перейдите в каталог bob \ marley.Однако я не могу выполнить команду «копировать bo * \ mar * C: \»

. Мне нужно использовать команду копирования, xcopy или какую-либо стандартную команду Windows с подстановочными знаками в пути, чтобы скопировать каталоги совпадений впункт назначения.Я не уверен, является ли это ограничением копирования и копирования или у меня неправильный синтаксис.Я также пробовал "xcopy / E / I bo * \ mar ** C: \ somedirectory".

Ответы [ 5 ]

23 голосов
/ 23 декабря 2011

Нет - вы не можете сделать это с помощью COPY или XCOPY.В том, что вы спрашиваете, есть существенный недостаток.

Что если у вас также есть каталог с именем "boston \ marathon"?Из какого каталога вы хотите скопировать?

Вы можете ответить - «Я хочу оба».Но теперь у вас есть неприятная потенциальная проблема.Что делать, если обе исходные директории содержат файл с именем «test.txt».Вы можете иметь только один файл с именем «test.txt» в вашем месте назначения.Какой из них вы держите?Правильного ответа нет, и это веская причина, по которой команда предназначена для запрета того, что вы пытаетесь сделать.

Приложение

Если вы готовыПредположим, что только одна папка соответствует шаблону, тогда вы уже знаете все шаги для достижения своей цели с помощью следующего:

@echo off
cd bo*\ma*
xcopy * c:\somedirectory

Если вы хотите вернуться туда, откуда начали, тогда используйте PUSHD / POPD вместоCD

@echo off
pushd bo*\ma*
xcopy * c:\somedirectory
popd

НО, вы должны быть очень осторожны.Бостон \ марафон может существовать, и ни PUSHD, ни CD не дадут никаких указаний на потенциальную проблему.

5 голосов
/ 19 апреля 2012

RusF. Примечание:

Используя XCOPY, больше нельзя использовать подстановочные знаки в имя файла для каталогов, а затем просто группа аналогично именованные каталоги копируются в архив или сетевую структуру.

(Подсказка: вы хотите делать это все время, если вы управляете большие пачки данных. Например. Видео или видео файлы (где много файлов может быть связано с производством. Или данные истории цен файлы в различных форматах или файлы базы данных из различных исследовательские проекты или экспериментальная работа.)

Я уверен, что раньше я мог делать это с более старой XCOPY, но с обновлениями (для безопасности), подстановочные знаки в имени файла, сделать не работает правильно (т.е. вы можете построить структуру каталогов, с параметром "/ t", но вы не можете получить чертовы файлы в каталоги для миграции! Чертовски раздражает.)

Ну, мы здесь, на ферме, всегда найдем решение. Даже если для этого нужно использовать .44 Magnum или Styer 50.:)

Итак, вот что я придумала:

Предположим, у вас есть несколько каталогов под названием "Fark_1, Fark_2, Fark-Special, Fark_in_the_Park, Fark99 ... "и т. Д.

Если все эти каталоги "Fark ..." существуют на диске C: \, и вы хотите перенести копию этой подструктуры в архив диск в сети (скажем, он называется: "h:") вы можете просто сделайте следующее:

Запуск командной строки FOR DO из Windows (MS-DOS):

 c:\>  XCOPY  fark*  h: /s /e /f /t

            The /s /e are for copying subdirs
            and empty directories, the /f says to
            show the files, and the /t says to only
            copy the disk directories.  No XCOPY
            option seems to exist anymore to copy the
            disk structure AND the files in the
            directories.

Чтобы получить файлы для копирования, выполните следующие действия: также из командной строки Windows:

 FOR /d %a in (fark*) DO XCOPY "%a" h:%a\ /s /e /f /h /k /y

            The /d says we are using directory names.
            The %a is the variable name, substituted
            into the command script for XCOPY. Make
            sure to use whatever logical name or drive
            letter you have for your archive structure.
            (ie. don't use h: in the above command,
            unless you have mapped h: to the place on
            the network where you want to copy your
            files to.)  And note, the /y option means
            overwrite any files already there.

Да, это старый Unix / DOS, но он работает, Вы можете поместить это в пакетную работу. И вы можете избежать мышонок, чтобы сделать работу. (Укажи, щелкни, хрюкни, прокляни. Повторение. Канонический процесс использования графического интерфейса, верно?) Теперь есть много причудливых способов сделать это. И различные такие утилиты, как Robocopy, XXcopy и так далее. Но это понятно сделано, и если у вас есть какая-либо копия Windows, вы, вероятно, уже есть вещи XCOPY и FOR-DO. Всего наилучшего. О, если вы вставите две команды в пакетное задание, то вы должны настроить синтаксис для двух уровней команды замена (я думаю, это правильный термин).

пример партии:

 REM --- copy the "fark*" files to the archive disk h:
 @echo off
 REM --- create/update the structure 
 xcopy fark* h: /s /e /f /t
 REM --- copy over the fark* dirs, and all associated subdirs
 for /d %%a in (fark*) do xcopy "%%a" "h:%%a\" /s /e /f /h /k /y
  • Русь Будущее 18 апреля 2012 года
4 голосов
/ 23 декабря 2011

на случай, если вы хотите скопировать все файлы для всех соответствующих каталогов. Вы все еще можете сделать что-то вроде этого ...

for /d %%d in (bo*) do (
  for /d %%e in (ma*) do (
     copy %%d\%%e\* c:\temp

но будьте осторожны в случае, когда файлы с одинаковым именем appera в разных каталогах.

1 голос
/ 27 февраля 2013

Это мой пакетный скрипт для резервного копирования некоторых папок на один диск, а некоторых на другой с помощью приведенной выше справки - отлично работает на Win 7.

Нет необходимости копировать структуру папок, если вы используете цикл FOR и / S просто скопирует измененные

Просто позор, что вы не можете использовать регулярные выражения здесь - или кто-то делаетесть более аккуратное решение?

FOR /d %%a in (2010* 2011* 2012* 201301* 2013020* 2013021* 20130222* 20130224*) DO (
  XCOPY "%%a" "Z:\Backup\My Videos\%%a\" /D /S /Y | findstr /V "0 File"
)
FOR /d %%a in (20130225* 201303*) DO (
  XCOPY "%%a" "X:\Backup\My Videos\%%a\" /D /S /Y | findstr /V "0 File"
)
0 голосов
/ 27 октября 2017

Так что, если вы знаете имя каталога, я не уверен, почему вы пытаетесь использовать подстановочные знаки. У меня была проблема, когда мы используем Mozilla Firefox, и многие веб-сайты, которые мы используем, требуют проверки подлинности с помощью карты общего доступа. По умолчанию Mozilla Firefox не настроен для использования CAC Reader. Поэтому я настроил свой Firefox с помощью CAC Reader, а затем взял файлы cert8.db и secmod.db из моего каталога пользователей C: \ Users \% myname% \ AppData \ Roaming \ Mozilla \ Firefox \ Profiles \ ?????? ? .default

Проблема заключалась в копировании этих файлов на несколько компьютеров и в несколько пользовательских каталогов, когда я не знаю, кто зашел на какой компьютер, а папка «???????. Default» названа для каждого пользователя по-своему.

Я создал текстовый файл с именем Computers.txt и ввел список наших компьютеров, извлеченных из Active Directory, а затем написал следующий сценарий для копирования файлов .db с устройством CAC, которые я скопировал в C: \ Temp \ Security

for /f %c in (C:\Temp\Computers.txt) do for /f %u in ('dir /B \\%c\C$\Users\') do for /f %m in ('dir /B \\%c\C$\Users\%u\AppData\Roaming\Mozilla\Firefox\Profiles\') do copy /Y C:\Temp\Security\*.db \\%c\C$\Users\%u\AppData\Roaming\Mozilla\Firefox\Profiles\%m\*
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...