Пакетный ход с исключениями? Или используя xcopy и удалив оригинал после?
У меня есть скрипт, который извлекает все файлы из всех подкаталогов и впоследствии удаляет пустые подкаталоги, часть, которая извлекает читает:
for /r %%a in (*.*) do move "%%a" "%~dp0"
Есть ли способ сделать это, за исключением подкаталогов с именем "_Unsorted"? Я знаю, у xcopy есть /exclude
вариант, так что-то вроде
for /r %%a in (*.*) do xcopy "%%a" "%~dp0" /exclude "\_Unsorted\"
будет почти работать, но я не уверен, как удалить оригинал после того, как он скопирован, чтобы по существу иметь тот же результат, что и move
3 ответа
Некоторые опции только для серии:
Добавьте фильтр в тело цикла:
for /r %%a in (*.*) do ( (echo %%~dpa | find /i "\_Unsorted\" 1>nul) || move "%%a" "%~dp0" )
В качестве альтернативы:
for /r %%a in (*.*) do ( (echo %%~dpa | find /i /v "\_Unsorted\" 1>nul) && move "%%a" "%~dp0" )
В обеих версиях
find
команда используется для сопоставления пути файла с подстрокой\_Unsorted\
, В первой версииfind
возвращаетсяsuccess
если есть совпадение иfail
иначе.move
Команда вызывается только в случаеfail
, который является эффектом||
operator`.Во второй версии
/v
переключатель меняет результатfind
а такжеsuccess
сейчас означает, что нет совпадения. Соответственно,&&
оператор используется для вызоваmove
в случаеsuccess
,Примените фильтр к списку файлов, чтобы цикл никогда не повторялся
_Unsorted
записей.for /f "delims=" %%a in ( 'dir /s /b ^| find /i /v "\_Unsorted\"' ) do move "%%a" "%~dp0"
Это более существенное изменение исходного сценария, чем предыдущий параметр, поскольку он заменяет
for /r
петля сfor /f
один.В основном,
for /f
Цикл используется для чтения / анализа фрагмента текста, текстового файла или вывода команды. В этом случаеdir
Команда предоставляет полный список файлов в дереве текущего каталога иfind
команда отфильтровывает те, которые содержат\_Unsorted\
на их пути.for /f
цикл читает список после того, как он был отфильтрованfind
Это означает, что он никогда не попадет в файлы, хранящиеся в_Unsorted
(суб) папки.
Можете ли вы использовать Robocopy?
robocopy from\path to\path *.* /mov /e /xd _Unsorted
/mov
: переместить, а не копировать (удалить источник после копирования)
/e
: рекурсивный (включая пустые подкаталоги)
/xd _Unsorted
: исключить каталоги с именем _Unsorted
Ответ 3 выше, используя ROBOCOPY, создает дерево (возможно, пустых) подкаталогов.
Следующее требует получения xxcopy
xxcopy c:\filematch d:\dest\ /SGF /RC
копирует из c: в папку d: \ dest
/SGF рекурсивно обращается к подкаталогам, но выравнивает результат в месте назначения. В случае коллизии имени файла он добавляет.0001 к первому дубликату имени файла. Таким образом /SGF копирует каждый соответствующий файл с исходного диска, независимо от того, какой подкаталог он занимает, в указанную папку назначения.
/ RC удаляет файлы из источника после успешного копирования, AKA перемещает их.
Не уверен, что это то, чего хотел ОП, но эта дискуссия мне помогла!