Переместить все файлы, кроме некоторых (шаблон файла) из команды 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\