Как переместить файлы с указанным расширением c из подкаталогов в другой каталог, включая создание подкаталогов, из которых создаются файлы с использованием CMD? - PullRequest
0 голосов
/ 22 февраля 2020

Каталог C:\Parent содержит две подкаталоги.

\basis             //contains folders which contain .pdf and .txt files
\basis_ft          //empty

Я хочу переместить все *.txt файлы из \basis до \basis_ft но они должны находиться в том же подкаталоге, в котором они находились прежде.

  • До:
C:\Parent\basis\UD00\
 00000A00.pdf
 00000A0A.pdf
 ft00000A00.txt
 ft00000A0A.txt
C:\Parent\basis_ft\   //empty   
  • После:
C:\Parent\basis\UD00\
 00000A00.pdf
 00000A0A.pdf
C:\Parent\basis_ft\UD00\
 ft00000A00.txt
 ft00000A0A.txt

Существует множество подкаталогов, таких как UD00, которые содержат различное количество файлов.

My текущий оператор выглядит следующим образом:

for /r "C:\Parent\basis\" %%x in (*.txt) do move "%%x" "C:\Parent\basis_ft"

Но при этом только все файлы *.txt выводятся в папку basis_ft.

Кто-нибудь из вас, ребята, имеет представление о том, как это сделать?

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

Ответы [ 2 ]

1 голос
/ 22 февраля 2020

Я думаю, что ROBOCOPY будет делать то, что вы хотите. Узнайте о параметрах, используя ROBOCOPY /?.

ROBOCOPY /S /MOV C:\Parent\basis C:\Parent\basis_ft *.txt

Если вы готовы использовать PowerShell, вы можете сделать следующее. Если вы уверены, что правильные файлы будут удалены, удалите -WhatIf из команды Remove-Item.

Copy-Item -Path 'C:\Parent\basis' -Destination 'C:\Parent\basis_ft' `
    -Filter '*.txt' -Recurse
Get-ChildItem -Path 'C:\Parent\basis' -Filter '*.txt' |
    ForEach-Object { Remove-Item -Path $_.FullName -WhatIf }
0 голосов
/ 22 февраля 2020

Эта задача создания каталога и перемещения файла может быть выполнена с помощью:

@echo off
set "BaseFolder=C:\Parent\basis"
for /D %%I in ("%BaseFolder%\*") do if exist "%%I\*.txt" (
    if not exist "%BaseFolder%_ft\%%~nxI\" md "%BaseFolder%_ft\%%~nxI" 2>nul
    if exist "%BaseFolder%_ft\%%~nxI\" move /Y "%%I\*.txt" "%BaseFolder%_ft\%%~nxI\" >nul
)
set "BaseFolder="

Этот пакетный скрипт выполняет поиск не скрытых подпапок в указанной базовой папке и назначает каждое полное имя папки переменной l oop I один за другим.

Для каждой подпапки в базовой папке проверяется наличие хотя бы одного файла с расширением .txt.

Если это условие истинно, оно Затем проверяется, есть ли соответствующая целевая папка, которая является подпапкой с тем же именем, что и текущая подпапка в базовой папке в целевой базовой папке с добавлением _ft к имени базовой папки. Целевая папка создается, если она еще не существует.

Далее проверяется, действительно ли целевая папка действительно существует, то есть создание целевой папки действительно прошло успешно. В этом случае все файлы с расширением .txt перемещаются из текущей подпапки в базовой папке в соответствующую целевую подпапку в базовой целевой папке с перезаписью, возможно, уже существующих текстовых файлов с тем же именем файла.

Для понимания используемые команды и как они работают, откройте окно командной строки , выполните там следующие команды и полностью прочитайте все страницы справки, отображаемые для каждой команды.

  • echo /?
  • for /?
  • if /?
  • md /?
  • move /?
  • set /?

См. Также статью Microsoft о Использование операторов перенаправления команд для объяснения 2>nul и >nul.

...