기존 데이터를 재구성하고 있으며 모든 기존 파일과 디렉터리를 수신하려면 새 하위 디렉터리를 만들어야 합니다. 이것의 목적은 새로운 제품 라인을 위한 공간을 마련하는 동시에 기존 데이터의 명명 규칙을 개선하는 것입니다.
예를 들어 현재 다음과 같은 데이터가 있습니다.
\root directory\
+-proj1357
+-closing binder
+-refi
+-compliance
+-proj2468
+-disbursements
+-compliance
+-proj3579
+-pre-close
+-compliance
실제로는 다음과 같아야 합니다.
\root directory\
+-proj1357
+-dpl
+-closing binder
+-refi
+-compliance
+-proj2468
+-dpl
+-disbursements
+-compliance
+-proj3579
+-dpl
+-pre-close
+-compliance
내가 겪고 있는 문제는 재귀 루프에 빠지지 않고는 올바른 명령을 얻을 수 없는 것 같다는 것입니다. 같이 해킹을 하다가 "순환 복사를 수행할 수 없습니다."라는 오류가 자주 발생했습니다.
좋은 소식은 작동하는 솔루션이 있다는 것입니다. 하지만 이를 위해서는 세 가지 별도의 명령과 각 프로젝트 디렉터리에 대한 사용자 지정 구문이 필요합니다.
command 1> ROBOCOPY G:\proj1357 DPL /E /MOVE
command 2> MOVE G:\proj1357\DPL\DPL\*.* G:\proj1357\DPL
command 3> RMDIR G:\proj1357\DPL\DPL\
내가 아는 한, 명령 1은 모든 파일과 디렉터리를 새 하위 디렉터리로 이동합니다. 또한 프로젝트 수준 디렉터리의 파일을 더 깊은 하위 디렉터리로 이동하면 반복적인 문제가 발생합니다. 그래서 저는 Command 2를 사용하여 한때 프로젝트 수준 디렉터리에 있었던 파일을 복구했습니다. 그런 다음 Command 3은 더 깊은 하위 디렉터리를 제거합니다.
Windows 기반 시스템을 통해 명령이나 배치 파일을 실행할 수 있는 더 좋은 방법이 있습니까? 이상적으로는 모든 프로젝트 수준 디렉터리를 크롤링하고 콘텐츠를 새 하위 디렉터리로 이동합니다. 저는 수천 개가 넘는 프로젝트를 처리하는 것을 보고 있으므로 올바르게 루프하는 방법을 알아내는 것은 시간을 투자할 가치가 있다고 생각합니다.
내가 직면한 상황에 대한 자세한 시각적 맥락은 아래 스크린샷을 참조하세요.
업데이트됨
위에 설명된 3단계 명령줄 방법을 사용하여 작동하도록 시도한 후 jiggunjer의 답변을 내 환경에 맞게 적용했습니다. 아래는 제가 사용한 MS 배치 파일입니다. 또한 각 줄의 목적을 명확히 하기 위해 설명을 추가했습니다.
@echo off
rem run this batch file in top level directory
rem top level directory should contain all project number directories
rem assumes that all directories starting with a digit are project number directories
rem initialize the listing of all directories
set rootlist=dir /b /a:D
rem initialize numerical filtering
set filter=findstr "^[1-9]"
rem loop through all directories that comply with filtering (start with a digit)
rem use command extension /F to process (in this case) command output
rem identifies all project number parent-directories
rem assign parent-directories to variable %%P, as in 'Project'
FOR /F %%P in ('%rootlist% ^| %filter%') DO (
rem pass the variable %%P to the moveproject loop
call :moveproject "%%P"
rem move files that were ignored by the robocopy command
rem these are 'loose' files that were in the project number directory, but not saved in any subdirectory
rem assumes the robocopy command successfully creates the DPL directory
MOVE %%P\*.* %%P\DPL\
)
rem pause to review command log
pause
:moveproject
rem ensure that the parameter has value
rem converts variable %%P to parameter no. 1
if not [%1] == [] (
rem loop through all sub-directories under each project number
rem use command extension /D to process directories only
rem removing any surrounding quotes (") from parameter no. 1 by using optional syntax -- percent-tilde
rem assign sub-directories to variable %%O, as in 'Origin'
FOR /D %%O IN ("%~1\*") DO (
rem display values
echo project number %%P
echo directory origin %%O
rem delimit origin directory using backslash character
rem use command extension /F to process (in this case) strings
rem assign the second delimited piece to variable %%D, as in 'Destination'
rem effectively drops all text to the left of the first backslash character
FOR /F "tokens=2 delims=\" %%D IN ("%%O") DO (
rem display values
echo %%D
echo directory destination %%P\DPL\%%D
rem move all directories to DPL sub-directory
rem simultaniously creates the receiving DPL directory
robocopy /E /MOVE "%%O" "%%P\DPL\%%D"
)
)
)
답변1
8개의 루트 디렉터리 각각에서 다음 명령을 실행합니다.
FOR /D %p IN ("*") DO robocopy /E /MOVE "%p" "%p/DPL"
파워셸 3.0+ 버전:
gci -dir -name | foreach-object{robocopy /E /MOVE $_ ($_ + '\DPL')}
또는
스크린샷에 따르면 올인원 솔루션은 다음과 같습니다.
@echo off
REM Assume: Running in top level dir.
REM Assume: Only project parent fodlers start with a digit.
set rootlist=dir /b /a:D
set filter=findstr "^[1-9]"
FOR /f %%d in ('%rootlist% ^| %filter%') DO (
call :moveproject "%%d"
)
:moveproject
if not [%1] == [] (
FOR /D %%p IN ("%~1\*") DO robocopy /E /MOVE "%%p" "%%p/DPL"
)
행복한 재육아 생활을 하세요!
답변2
다음을 수행할 수 있습니다.
@echo off
mkdir %2
cd %1
SETLOCAL EnableDelayedExpansion
for /f "delims=" %%D in ('dir /a:d /b') do (
set project_path=%%~fD
move "!project_path!" "%~2%\temp"
mkdir "!project_path!"
move "%~2%\temp" "!project_path!\dpl"
)
2개의 매개변수를 사용합니다. 첫 번째는 프로젝트가 포함된 경로이고, 두 번째는 임시 경로입니다.
이것이 하는 일은 단순히 프로젝트를 임시 경로로 이동한 다음 다시 이전 프로젝트 이름/dpl로 이동하는 것입니다.
참고: 첫 번째 경로에는 프로젝트 디렉터리만 포함되어 있다고 가정하고 이 수준에서는 디렉터리가 아닌 디렉터리는 무시합니다.