Переместить все файлы, кроме некоторых (шаблон файла) из команды DOS - PullRequest
8 голосов
/ 04 ноября 2010

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

Например, я хочу переместить все файлы, которые не начинаются с «aaa»

for %i in (*) do if not %i == aaa* move %i .\..

Ответы [ 6 ]

13 голосов
/ 19 декабря 2010

XCOPY предназначен для работы со списками ' exclude ' ... См. Ниже:

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

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

В первой строке выполняется DIR (каталог) списка папки source , в котором перечислены файлы в чистом формате ( / b ), игнорируя имена каталогов ( / объявление ). Выходные данные передаются в команду FINDSTR .

FINDSTR просматривает каждое имя файла и сравнивает его начало ( / b ) со строкой " aaa ".

Если начало имени файла соответствует строке " aaa ", имя файла перенаправляется (записывается) в файл aaafiles.tmp в пользователях TEMP каталог.

/ b жизненно необходим, поскольку вы не хотите исключать такие файлы, как theaaafile.txt .

Команда XCOPY копирует файлы из папки source в папку destination , за исключением файлов, перечисленных в aaafiles.tmp .

Запрос на перезапись существующих файлов ( / y ) отключен.

источник и пункт назначения необходимо будет заменить ваши собственные имена.

5 голосов
/ 06 мая 2014

Робокопия - это возможность

robocopy source destination *.* /mov /XF aaa*.*

параметры см. Здесь http://technet.microsoft.com/en-us/library/cc733145.aspx

4 голосов
/ 18 ноября 2011

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

Переместите (скопируйте и удалите) все файлы, кроме тех, которые начинаются с "aaa", из текущей директории в "dest". Может также указывать полный путь к источнику.

attrib +a *.*
attrib -a aaa*.*
xcopy /a [or /m] *.* dest
del /aa /q *.*  
4 голосов
/ 05 ноября 2010

Один из способов сделать это - создать список файлов для перемещения во временный файл. Затем используйте файл с командой for. Создайте список, используя findstr.

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

Первая команда получает список всех файлов (без каталогов) в текущем каталоге, а затем направляет список в findstr, который исключает (/v) имена файлов, соответствующие шаблону, и помещает его в файл @movelist во временном каталоге. Вторая команда просто принимает эти результаты, поэтому вы можете делать с ними все, что захотите (переместите).

Возможно, есть лучший способ сделать это одной командой без временного файла, я просто не знаю, как это написать. Я не уверен, как вызвать команду dir из команды for. AFAIK, он принимает только существующие программные файлы, а не встроенные команды.

2 голосов
/ 19 марта 2014

В некоторых случаях это можно сделать более простым.Например, мне пришлось рекурсивно скопировать несколько каталогов, но исключая все изображения (файлы png и bmp), поэтому я просто создал файл excludeList.txt, содержащий:

.png
.bmp

и запустил

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

Он будет соответствовать любому файлу или каталогу , содержащему .png, но не обязательно , заканчивающемуся на .png.(Я не исследовал, возможно ли разумное использование подстановочных знаков или регулярных выражений).Он не обрабатывает ваш конкретный пример (на который у вас уже есть хороший ответ), но он решил мою проблему, и эту страницу я нашел, когда гуглил в поисках решения:)

1 голос
/ 26 июня 2018

Не идеально, но перемещение всех файлов к месту назначения и перемещение файлов обратно к источнику - быстрый способ с реальной операцией перемещения (без копий). Конечно, это предполагает, что в месте назначения нет файлов, соответствующих шаблону.

move source\*.* destination\ && move destination\aaa*.* source\

...