Пакетный ход с исключениями? Или используя xcopy и удалив оригинал после?

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

for /r %%a in (*.*) do move "%%a" "%~dp0"

Есть ли способ сделать это, за исключением подкаталогов с именем "_Unsorted"? Я знаю, у xcopy есть /exclude вариант, так что-то вроде

for /r %%a in (*.*) do xcopy "%%a" "%~dp0" /exclude "\_Unsorted\"

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

3 ответа

Решение

Некоторые опции только для серии:

  1. Добавьте фильтр в тело цикла:

    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,

  2. Примените фильтр к списку файлов, чтобы цикл никогда не повторялся _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 перемещает их.

Не уверен, что это то, чего хотел ОП, но эта дискуссия мне помогла!

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