평평한 디렉토리 구조


15

폴더 내에 묶음 폴더가 있습니다. 이렇게

Root Folder
    -- Folder 1
    -- Folder 2
    -- Folder 3
    -- Folder 4

folder1, folder 2, folder 3, ... folder n 아래의 모든 파일이 루트 폴더 아래에 있도록 모든 폴더를 축소하고 싶습니다.

Windows 에서이 작업을 수행하는 가장 빠른 방법은 무엇입니까?


5
중복 파일 이름을 어떻게 처리하고 싶습니까?
Mark Allen

답변:


19

특별한 도구 나 스크립팅을 사용할 이유가 없습니다. 탐색기에서 검색 기능을 사용하십시오.

  1. 탐색기에서 병합하려는 폴더를 엽니 다.
  2. 새 폴더를 만들고 모든 파일 (폴더는 아님)을 선택한 다음 해당 폴더로 드래그합니다 (이러한 파일의 사본 두 개가 생성되지 않도록합니다).
  3. 검색 창 (주소 표시 줄 오른쪽에있는)에서 입력 *하고 Enter 키를 누릅니다.
  4. 목록이 채워지면 마우스 오른쪽 버튼을 클릭하고 모두를 선택한 다음 마우스 오른쪽 버튼을 클릭하고 잘라냅니다.
  5. 뒤로 버튼을 눌러 원래 폴더로 돌아간 다음 마우스 오른쪽 버튼을 클릭하고 붙여 넣습니다.
  6. 중복 된 이름이 있으면이를 처리하는 방법을 묻는 메시지가 나타납니다. 사용 사례에 가장 적합한 옵션을 선택하십시오. (두 파일을 모두 복사한다고 가정합니다.) 메시지가 다시 표시되지 않도록하려면 아래쪽에 확인란이있는 모든 파일에이 파일을 적용하십시오.
  7. 모든 폴더를 선택하고 선택한 파일 수에 대한 팝업을보고 비어 있는지 확인한 다음 삭제하십시오.

오히려 스크립트를 사용하여 시작하고 잊어 버릴 수 있다면 그렇게 할 수도 있습니다. 교체 명령 mv *\* .은 매우 쉽지만 ( for /r %f in (*.*) do @move "%~f" .), @Nicole Hamilton의 답변에서와 같이 복제본을 남겨 두지 않고 중복을 처리하고 싶습니다. 중복 파일 이름에 숫자를 추가하는 것이 가장 쉬운 방법 일 것입니다.

다음 배치 파일을 복사하여 메모장에 붙여 넣고 "flatten.cmd"(따옴표 포함)로 저장하십시오.

@echo off
cd "%~1"
md tempryfolder
move *.* tempryfolder
for /r %%f in ("*.*") do call :START "%%~f"
for /r /d %%f in (*.*) do rd "%%~f" 
GOTO :EOF
:START
setlocal
If exist "%~n1%~x1" set /a num=2
:LOOP
If exist "%~n1%num%%~x1" (
    set /a num+=1
    goto loop
)
move "%~1" "%~n1%num%%~x1"

스크립트를 사용하려면 평평하게 만들 폴더를 드래그하십시오.


1
비슷하지만 이해하기 쉽다 : superuser.com/a/523854/433830
aparente001

참고 :이 스크립트는 본질적으로 포크 폭탄입니다. 수천 개의 하위 디렉토리와 수만 개의 하위 파일이있는 폴더에서 사용하고 있으며 메모리 사용량이 천천히 증가하고 있습니다. OOM 문제가 발생할 것이라고 생각하지는 않지만 명심해야 할 사항입니다.
Nzall

@Nzall 나는 그렇게 할 수 있다고 믿는 데 아무런 문제가 없지만 내 코드가 아닌 Microsoft를 비난 할 것입니다. 배치 파일에서 서브 루틴을 여러 번 호출하기 만하면됩니다. 그리고 한 번에 두 개 이상 실행하지 않습니다. 각 서브 루틴은 완료 될 때까지 실행되어 한 번에 하나의 프로세스 만 실행합니다. 우리는 얼마나 많은 메모리를 사용하고 있습니까?
trlkly

@trlkly 한 시점에 2GB까지 올라갔지 만 약 75,000 개의 파일과 수천 개의 폴더가 상당히 많은 폴더와 하위 폴더를 가지고있었습니다. 약 8-900MB로 줄어든 후 잠시. 그래도 많은 중복 파일이있었습니다. 7,500 파일 Javascript 라이브러리의 사본 12 개를 병합하여 특정 소프트웨어가 수만 개의 파일이있는 폴더를 처리하는 방법을 테스트 할 수있었습니다.
Nzall

@Nzall 그것은 엄청나게 이상합니다. 스크립트가하는 일은 아무것도하지 않습니다. 파일을 증가시키기 위해 단일 변수를 재사용하는 하나의 서브 루틴입니다. SO 또는 그와 같은 메모리에서 이러한 큰 메모리 사용을 유발할 수있는 것이 무엇인지 묻어 야 할 수도 있습니다.
trlkly

9

병합하려는 System.Kind:<>folder폴더로 이동하고 결과에서 폴더를 제외하도록 검색하여 Windows 탐색기에서 병합 할 수 있습니다 .

그런 다음 Ctrl + A를 사용하여 모든 파일을 선택하고 복사하여 새 폴더에 붙여 넣을 수 있습니다. Windows 탐색기에서 중복 파일 이름을 처리하는 방법을 묻습니다.

여기에 이미지 설명을 입력하십시오


1
이 작업을 수행하려면 현지화 된 해당 번역에 "폴더"를 입력해야합니다 (예 : 이탈리아어는 System.Kind:<>cartella)
JohnKiller

0

이런 종류의 일은 유닉스 쉘에서 쉽습니다. 내 자신의 Hamilton C 쉘 ( 무료 버전 포함 )로 수행 할 수있는 작업은 다음과 같습니다. Cygwin bash 와 매우 유사한 작업을 수행 할 수 있습니다.

mv *\* .

디렉토리가 실제로 큰 경우 Windows가 하위 프로세스로 전달하기에는 너무 긴 명령 행으로 와일드 카드를 사용할 수 있습니다. (Windows CreateProcess 호출은 인수 목록을 32K 유니 코드 문자로 제한합니다.) 그러나 C 쉘에는 내부적으로 제한이 없으므로 다음과 같이 전체 목록을 반복 할 수 있습니다.

foreach i ( *\* )
   mv $i .
end

위의 @MarkAllen의 관점에서, 이런 종류의 이름은 중복 된 이름이 없다고 가정합니다. 있는 경우 목록의 이후 사본이 이전 사본을 겹쳐 씁니다. 이것이 문제가 mv되는 경우 덮어 쓰지 않을 경우에만 파일을 반복 할 수 있습니다 . :t운영자는 것입니다 꼬리 연산자 . -e운영자는이다 파일이 테스트를 존재 .

foreach i ( *\* )
   if ( -e $i:t ) then
      echo -2 $i not moved because it already exists
   else
      mv $i .
   end
end

이것은 여전히 ​​비어있는 디렉토리를 남겨두고, 비운 후에 원하지 않을 수도 있습니다. 중요한 경우 다음 반복이 될 수 있습니다.


cygwin> mv * 사용. mv : stat`* '를 말할 수 없습니다 : 그런 파일이나 디렉토리가 없습니다
5

Cygwin bash에서는 mv */* .나를 위해 일합니다.
니콜 해밀턴

3
어떤 사람들은 유닉스주의에 너무 고착되어 있습니다 ... Windows 7에서 스크립팅을 실제로하려면 PowerShell이 ​​있습니다. Cygwin과 같은 가짜 bash 시뮬레이터가 필요하지 않습니다.

PowerShell이 ​​필요하지 않습니다. 일반 명령 행은 여전히 ​​존재하며 동일한 작업을 수행 할 수 있습니다. 아래 답변을 참조하십시오.
trlkly
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.