Переместить все файлы, кроме некоторых (шаблон файла) из команды DOS

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

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

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

6 ответов

Решение

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

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

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

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

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

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

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

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

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

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

Robocopy это возможность

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

варианты смотрите здесь http://technet.microsoft.com/en-us/library/cc733145.aspx

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

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

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

Один из способов сделать это - создать список файлов для перемещения во временный файл. Затем используйте файл с 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 он принимает только существующие программные файлы, а не встроенные команды.

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

.png
.bmp

и беги

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

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

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

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

Другие вопросы по тегам