'for'루프를 사용하여 디렉토리의 모든 파일을 반복하십시오.


352

for루프를 사용하여 디렉토리의 각 파일을 어떻게 반복 할 수 있습니까?

특정 항목이 디렉토리인지 아니면 파일인지를 어떻게 알 수 있습니까?


1
당신이 기본 윈도우 쉘을 의미한다고 가정하면, 나는 당신의 게시물을 약간 더 명확하게 다시 태그했습니다
David Schmitt

2
사용중인 Windows 버전을 지정하십시오.
jop September

1
이것은 서로 독립적이기 때문에 두 가지 질문으로 나누어 져야합니다.
julealgon

답변:


492

현재 디렉토리에있는 모든 파일과 파일 만 나열됩니다.

for /r %i in (*) do echo %i

또한 배치 파일에서 해당 명령을 실행하는 경우 % 부호를 두 배로 늘려야합니다.

for /r %%i in (*) do echo %%i

(감사합니다 @agnul)


73
이것을 재귀 적으로 사용하지 않으려면 / r
jocull을

28
현재 디렉토리에 파일 이름 (전체 경로가 아님) 만 확장명을 사용하여 (재귀 적으로) 반향하려는 경우 다음과 같이 수행 할 수 있습니다 for /r %i in (*) do ( echo %~nxi ). 이 스레드는 정말 너무 유용 할 수 있습니다 : stackoverflow.com/questions/112055/... .
Sk8erPeter

2
@Vaccano 네, Do 후에 괄호를 사용하십시오. 즉 (에코 % i 및 델 % i). 여러 명령에 "&"대신 "enter"를 사용할 수도 있습니다.
Jay

2
echo 대신 copy / move와 같은 명령을 사용하는 경우 경로를 올바르게 인용해야합니다. 대한 / (*) 에코 할 "%% I"의 R %% 전
Soundararajan

2
단일 문자 변수 이름을 사용해야합니다.
Álvaro González

214

반복 ...

  • ... 현재 디렉토리의 파일 : for %f in (.\*) do @echo %f
  • ... 현재 디렉토리의 하위 디렉토리 : for /D %s in (.\*) do @echo %s
  • ... 현재 및 모든 하위 디렉토리의 파일 : for /R %f in (.\*) do @echo %f
  • ... 현재 및 모든 하위 디렉토리의 하위 디렉토리 : for /R /D %s in (.\*) do @echo %s

불행히도 파일과 하위 디렉토리를 동시에 반복하는 방법을 찾지 못했습니다.

더 많은 기능을 위해 bash와 함께 cygwin 을 사용하십시오 .

이 외에도 MS Windows의 기본 제공 도움말은 cmd의 명령 줄 구문에 대한 설명을 제공하는 훌륭한 리소스입니다.

또한 여기를보십시오 : http://technet.microsoft.com/en-us/library/bb490890.aspx


21
%file그리고 %subdir단지 즉 긴 한 문자가 될 수 있습니다 %f, %s.
Felix Dombek

1
'현재 디렉토리의 하위 디렉토리'가 작동하지 않습니다. 오류가 발생했습니다 : s는 현재 예상치 못한 것입니다
Migrate2Lazarus 내 프로필보기

78

각 파일을 반복하려면 for 루프가 작동합니다.

for %%f in (directory\path\*) do ( something_here )

제 경우에는 파일 내용, 이름 등도 원했습니다.

이로 인해 몇 가지 문제가 발생하여 유스 케이스가 도움이 될 것이라고 생각했습니다. 다음은 디렉토리의 각 '.txt'파일에서 정보를 읽고 해당 파일로 무언가를 수행 할 수있는 루프입니다 (예 : setx).

@ECHO OFF
setlocal enabledelayedexpansion
for %%f in (directory\path\*.txt) do (
  set /p val=<%%f
  echo "fullname: %%f"
  echo "name: %%~nf"
  echo "contents: !val!"
)

* 제한 : val <= %% f는 파일의 첫 번째 줄만 가져옵니다.


18
아, 여러 줄 예입니다. 고마워요!
Nyerguds

@Aaron Votre 루프를 끝내는 방법?
nijogeorgep

@nijogeorgep 루프를 "종료"할 필요는 없습니다. 이 예에서는 괄호 안의 모든 내용 (echo 등)이 디렉토리의 각 '* .txt'파일에 대해 한 번씩 실행됩니다. 나는 당신이 찾고있는 대답이 여기에 더 잘 설명 될 것이라고 생각합니다 : stackoverflow.com/questions/1355791/…
Aaron Votre

@Aaron Votre 스크립트를 사용하여 일부 maven 명령을 실행하려고했지만 무한 루프로 실행 중이므로 요청했습니다. 지금 구입 루프에 출구를 추가하고 문제를 해결했습니다
nijogeorgep

@nijogeorgep 다행 이네요.
Aaron Votre 2016 년

57

FOR명령 줄에서 실행 하는 것과 배치 파일에서 실행하는 것에 는 약간의 차이가 있습니다. 배치 파일에서 %각 변수 참조 앞에 두 문자 를 넣어야 합니다.

명령 행에서 :

FOR %i IN (*) DO ECHO %i

배치 파일에서 :

FOR %%i IN (*) DO ECHO %%i

44

이 for-loop는 디렉토리의 모든 파일을 나열합니다.

pushd somedir
for /f "delims=" %%f in ('dir /b /a-d-h-s') do echo %%f
popd

"delims ="는 공백이있는 긴 파일 이름을 표시하는 데 유용합니다 ...

'/ b'는 크기 날짜 등이 아닌 이름 만 표시합니다.

dir의 / a 인수에 대해 알아야 할 사항.

  • "/ a"를 사용하면 숨겨진 속성 및 시스템 속성을 포함한 모든 것이 나열됩니다.
  • "/ ad"는 숨겨진 디렉토리와 시스템 디렉토리를 포함한 서브 디렉토리 만 표시합니다.
  • "/ ad"인수는 'D' irectory 속성이있는 컨텐츠를 제거합니다.
  • "/ adhs"는 모든 것을 표시하지만 'D' irectory,'H'idden 'S'ystem 속성이있는 항목을 표시합니다.

명령 행에서 이것을 사용하는 경우 "%"를 제거하십시오.

도움이 되었기를 바랍니다.


10

% 1은 (는) 처음 전달 된 인수를 나타내며 반복자에서 사용할 수 없습니다.

이 시도:

@echo off
for %%i in (*.*) do echo %%i

네가 옳아. 나는 FOR 구문을 확인하기 위해 즉각적인 모드로 시도하고 매개 변수를 잊어 버린 대답에 바로 줄을 붙여 넣었습니다. :-)
Axeman

5
for %1 in (*.*) do echo %1

전체 안내서를 보려면 cmd에서 "HELP FOR"을 사용해보십시오.

XP 명령어를위한 안내서입니다. http://www.ss64.com/nt/


4

사용할 수있는 모든 파일과 폴더반복 하려면

for /F "delims=" %%a in ('dir /b /s') do echo %%a

파일이 아닌 모든 폴더반복 하려면 다음을 사용할 수 있습니다

for /F "delims=" %%a in ('dir /a:d /b /s') do echo %%a

어디 /s무제한 깊이 디렉토리 트리에 걸쳐 모든 결과를 줄 것이다. /s하위 폴더가 아닌 해당 폴더의 내용을 반복하려면 건너 뛸 수 있습니다

반복적으로 검색 구현

반복 처리라는 이름의 파일과 폴더를 특정 통해 당신은 이름을 검색 할 수 있고 반복 처리 루프에 사용

for /F "delims=" %%a in ('dir "file or folder name" /b /s') do echo %%a

파일이 아닌 특정 명명 된 폴더 / 디렉토리반복 하려면 /AD동일한 명령에서 사용 하십시오.

for /F "delims=" %%a in ('dir "folder name" /b /AD /s') do echo %%a

4

https://ss64.com/nt/for_r.html을 찾을 때까지 절대 경로로 작업하기 위해 jop의 대답을 얻는 데 문제가있었습니다.

다음 예제는 절대 경로로 지정된 디렉토리의 모든 파일을 반복합니다.

For /R C:\absoulte\path\ %%G IN (*.*) do (
  Echo %%G
)

3

다음 코드 는 현재 디렉토리에 이름이 "AllFilesInCurrentDirectorylist.txt"인 파일을 작성합니다 . 여기에는 현재 디렉토리의 모든 파일 (파일 만) 목록이 들어 있습니다. 확인 해봐

dir /b /a-d > AllFilesInCurrentDirectorylist.txt

3

forfiles 명령을 사용할 수도 있습니다 .

forfiles /s 

또한 디렉토리인지 확인하십시오.

forfiles /p c:\ /s /m *.* /c "cmd /c if @isdir==true echo @file is a directory"

@isdir==true요구가되게합니다@isdir==TRUE
psyklopz

2

배치에서 이름이 파일 또는 디렉토리임을 알 수 없기 때문에 vbscript (Windows Scripting Host)를 사용합니다.

vbs에서는 다음과 같이 될 수 있습니다.

Dim fileSystemObject
Set fileSystemObject = CreateObject("Scripting.FileSystemObject")

Dim mainFolder
Set mainFolder = fileSystemObject.GetFolder(myFolder)

Dim files
Set files = mainFolder.Files

For Each file in files
...
Next

Dim subFolders
Set subFolders = mainFolder.SubFolders

For Each folder in subFolders
...
Next

MSDN에서 FileSystemObject를 확인하십시오 .


나는 이것을하기 위해 perl을 사용했을 것이다. 불행히도, 그것은 나에게 달려 있지 않습니다.
Vhaerun

오래된 응용 프로그램? 슬픈 일.
Biri

바보 개발자는 배치 파일을보고 모든 문제에 대한 치료제라고 생각했습니다.
Vhaerun

1
@Vhaerun Perl에 비해 WSH (Windows Script Host)의 장점 중 하나는 WSH에 모든 버전의 Windows가 사전 설치되어 있지만 Perl은 별도로 설치해야하므로 모든 경우에 실행 가능한 옵션 일 수도 있고 아닐 수도 있다는 것입니다.
Parampreet Dhatt

2

xcopy 명령을 / L 옵션과 함께 사용하여 파일 이름을 가져옵니다. 따라서 디렉토리 또는 하위 디렉토리의 모든 파일을 얻으려면 다음과 같이 할 수 있습니다.

for /f "delims=" %%a IN ('xcopy "D:\*.pdf" c:\ /l') do echo %%a

c : \는 항상 Windows 시스템에 존재하고 복사하지 않으므로 대상으로 사용하십시오. 중요하지 않습니다. 하위 디렉토리도 원하는 경우 끝에 / s 옵션을 사용하십시오. 다른 이유로 필요할 경우 다른 xcopy 스위치를 사용할 수도 있습니다.


2

파일이 디렉토리인지 테스트하려면 다음을 시도하십시오.

FOR /F "delims=" %I IN ('DIR /B /AD "filename" 2^>^&1 ^>NUL') DO IF "%I" == "File Not Found" ECHO Not a directory

파일이 디렉토리가 아닌지 여부 만 알려줍니다. 파일이 존재하지 않는 경우에도 마찬가지이므로 필요한 경우 먼저 확인하십시오. 캐럿 (^)은 경로 재 지정 기호를 이스케이프하는 데 사용되며 파일 목록 출력은 표시되지 않도록 NUL로 경로 재 지정되며 DIR 목록의 오류 출력은 출력으로 경로 재 지정되므로 DIR의 메시지 "파일을 찾을 수 없음"에 대해 테스트 할 수 있습니다. ".


2

이 시도:

::Example directory
set SetupDir=C:\Users

::Loop in the folder with "/r" to search in recursive folders, %%f being a loop ::variable 
for /r "%SetupDir%" %%f in (*.msi *.exe) do set /a counter+=1

echo there are %counter% files in your folder

디렉터리 (및 하위 디렉터리)의 .msi 및 .exe 파일을 계산합니다. 따라서 실행 파일로 폴더와 파일의 차이를 만듭니다.

루프에서 다른 파일을 필터링해야하는 경우 확장명 (.pptx .docx ..) 만 추가하십시오.


1

필자의 경우 임시 폴더 아래의 모든 파일과 폴더를 삭제해야했습니다. 그래서 이것이 내가 끝낸 방법입니다. 파일과 폴더마다 하나씩 두 개의 루프를 실행해야했습니다. 파일이나 폴더 이름에 공백이 있으면 ""를 사용해야합니다.

cd %USERPROFILE%\AppData\Local\Temp\
rem files only
for /r %%a in (*) do (
echo deleting file "%%a" ...
if exist "%%a" del /s /q "%%a"
)
rem folders only
for /D %%a in (*) do (
echo deleting folder "%%a" ...
if exist "%%a" rmdir /s /q "%%a"
)

1

다음은 코드에서 주석으로 이동 한 것입니다.

나는 단지 biatch 기술로 솔질하고있어서 명백한 오류를 용서합니다.

사용자가 필요로하는 부분을 약간 수정하면 가능한 한 최선의 솔루션으로 모든 것을 작성하려고했습니다.

몇 가지 중요한 참고 사항 : 루트 디렉토리 파일 및 폴더 만 처리 하려면 변수 recursive를로 변경하십시오 FALSE. 그렇지 않으면 모든 폴더와 파일을 통과합니다.

C & C가 가장 환영합니다 ...

@echo off
title %~nx0
chcp 65001 >NUL
set "dir=c:\users\%username%\desktop"
::
:: Recursive Loop routine - First Written by Ste on - 2020.01.24 - Rev 1
::
setlocal EnableDelayedExpansion
rem THIS IS A RECURSIVE SOLUTION [ALBEIT IF YOU CHANGE THE RECURSIVE TO FALSE, NO]
rem By removing the /s switch from the first loop if you want to loop through
rem the base folder only.
set recursive=TRUE
if %recursive% equ TRUE ( set recursive=/s ) else ( set recursive= )
endlocal & set recursive=%recursive%
cd /d %dir%
echo Directory %cd%
for %%F in ("*") do (echo    → %%F)                                 %= Loop through the current directory. =%
for /f "delims==" %%D in ('dir "%dir%" /ad /b %recursive%') do (    %= Loop through the sub-directories only if the recursive variable is TRUE. =%
  echo Directory %%D
  echo %recursive% | find "/s" >NUL 2>NUL && (
    pushd %%D
    cd /d %%D
    for /f "delims==" %%F in ('dir "*" /b') do (                      %= Then loop through each pushd' folder and work on the files and folders =%
      echo %%~aF | find /v "d" >NUL 2>NUL && (                        %= This will weed out the directories by checking their attributes for the lack of 'd' with the /v switch therefore you can now work on the files only. =%
      rem You can do stuff to your files here.
      rem Below are some examples of the info you can get by expanding the %%F variable.
      rem Uncomment one at a time to see the results.
      echo    → %%~F           &rem expands %%F removing any surrounding quotes (")
      rem echo    → %%~dF          &rem expands %%F to a drive letter only
      rem echo    → %%~fF          &rem expands %%F to a fully qualified path name
      rem echo    → %%~pF          &rem expands %%A to a path only
      rem echo    → %%~nF          &rem expands %%F to a file name only
      rem echo    → %%~xF          &rem expands %%F to a file extension only
      rem echo    → %%~sF          &rem expanded path contains short names only
      rem echo    → %%~aF          &rem expands %%F to file attributes of file
      rem echo    → %%~tF          &rem expands %%F to date/time of file
      rem echo    → %%~zF          &rem expands %%F to size of file
      rem echo    → %%~dpF         &rem expands %%F to a drive letter and path only
      rem echo    → %%~nxF         &rem expands %%F to a file name and extension only
      rem echo    → %%~fsF         &rem expands %%F to a full path name with short names only
      rem echo    → %%~dp$dir:F    &rem searches the directories listed in the 'dir' environment variable and expands %%F to the fully qualified name of the first one found. If the environment variable name is not defined or the file is not found by the search, then this modifier expands to the empty string
      rem echo    → %%~ftzaF       &rem expands %%F to a DIR like output line
      )
      )
    popd
    )
  )
echo/ & pause & cls
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.