Windows 명령 프롬프트에서 전체 경로와 파일 크기 만 반복적으로 표시하는 파일 나열


50

특정 디렉토리와 하위 디렉토리의 모든 파일에 대한 파일 이름 (전체 경로 포함)과 파일 크기가 포함 된 텍스트 파일을 생성하려고합니다 (예 : 재귀). 이상적으로는 파일 크기가 쉼표를 원하지 않습니다 (그러나 나는 그것들을 해결할 것입니다!)

다음 명령은 파일 크기없이 수행합니다.

dir /b /s /a:-D > results.txt

예제 출력은 다음과 같습니다.

C:\Users\Martin\Pictures\Table\original\PC120013.JPG  227298
C:\Users\Martin\Pictures\Table\original\PC120014.JPG  123234
C:\Users\Martin\Pictures\Table\original\PC120015.JPG  932344

나는 이것이 dir틀린 것으로 입증되기를 원하지만 이것이 혼자 사용하는 것이 가능하다고 생각하지 않습니다 . 명령 프롬프트에서 사용할 수있는 명령 만 사용하여 다른 방법이 있습니까?

답변:


28

이것은해야합니다 :

@echo off & for /f %a in ('dir /s /b') do echo %~fa %~za

매우 효율적이지 않습니다 ... 많은 파일을 포함하는 폴더에 대해 실행하면 스케치가 될 수 있으므로 작은 폴더에서 먼저 시도하십시오.

"에서 /?" 도움말 텍스트 ( 'I'대신 'a'를 사용함)

In addition, substitution of FOR variable references has been enhanced.
You can now use the following optional syntax:

%~I         - expands %I removing any surrounding quotes (")
%~fI        - expands %I to a fully qualified path name
%~dI        - expands %I to a drive letter only
%~pI        - expands %I to a path only
%~nI        - expands %I to a file name only
%~xI        - expands %I to a file extension only
%~sI        - expanded path contains short names only
%~aI        - expands %I to file attributes of file
%~tI        - expands %I to date/time of file
%~zI        - expands %I to size of file
%~$PATH:I   - searches the directories listed in the PATH
               environment variable and expands %I 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

The modifiers can be combined to get compound results:

%~dpI       - expands %I to a drive letter and path only
%~nxI       - expands %I to a file name and extension only
%~fsI       - expands %I to a full path name with short names only
%~dp$PATH:I - searches the directories listed in the PATH
               environment variable for %I and expands to the
               drive letter and path of the first one found.
%~ftzaI     - expands %I to a DIR like output line

6
파일 이름에 공백이있는 파일이 올바르게 등록되지 않았습니다. 이 문제를 해결하기 위해 "tokens=*"다음과 같이 추가했습니다@echo off & for /f "tokens=*" %a in ('dir /s /b') do echo %~fa %~za
Don Vince

txt파일 로 인쇄하는 방법 ?
Saeed Neamati 4

3
그것은해야한다for /r %a in (*) do echo %~fa %~za
ZAB

1
@Saeed Neamati – 여기 예제 >> C:\Temp\VideoList.txt가 있습니다. 이전의 프로세스 결과는 VideoList 라는 텍스트 파일에 기록됩니다 . > 를 사용 하면 파일을 덮어 쓰고 ( 이미 존재하는 경우 ) >> 를 사용 하면 텍스트 파일이 있으면 끝에 새 결과를 추가합니다 ( 이미 존재하는 경우 ). 텍스트 파일이 없으면이 명령은 지정된 이름으로 새 파일을 씁니다.
user23715

이 파일 크기 산세, 텍스트 파일로, 나에게 * .DWG 파일의 목록을했다 :@echo off & for /f "tokens=*" %a in ('dir *.dwg /s /b') do echo %~fa >>dwgfiles.txt
CAD의 놈

14

대안 # 1 : FOR / R은 나에게 # 2보다 직관적입니다.
대안 # 2 : FOR / F는 BrianAdkins의 제안에서 "이름의 공백"문제를 해결합니다.
대안 # 3 : 경로가 큰 따옴표로 묶인 것을 제외하고 FORFILES가 제 선택입니다.

브라이언이나 다른 전문가들은 더 우아한 솔루션을 가지고 있거나 12 가지 다른 솔루션을 제안 할 수 있지만이 3 가지 작업은 가능합니다. FOR TOKENS를 사용해 보았지만 머리글과 바닥 글을 제거해야 # 1로 되돌아갔습니다. 또한 작은 .bat 파일을 만들고 호출하는 것을 고려했지만 다른 파일이 추가되었습니다 (함수와 마찬가지로 더 큰 유연성을 제공하지만).

공백이있는 디렉토리 및 파일 이름, 200 + 문자 파일 이름, 확장명이없는 파일 이름 및 작은 드라이브의 루트 (시간은 조금만-Brian이 제안한 것처럼 약간 느리게)로 모든 대안을 테스트했지만 Windows 탐색기에서 검색 중이므로 모든 검색 앱을 설치 한 것입니다).

대안 # 1 : FOR / R

Best (?) Brian의 솔루션이 왜 효과가 없는지 알아 내려고 노력하면서 HELP FOR를 살펴보고 / R 접근법을 시도하기로 결정했습니다. (파일 생성은 대안 # 2와 동일합니다.)

@echo off & for /R "c:\deletelater\folder with spaces" %A in (*.*) do echo %~fA %~zA

예-작동 (재귀를 보여주기 위해 위와 다른 디렉토리)

@echo off & for /R "c:\deletelater" %A in (*.*) do echo %~fA %~zA
c:\DeleteLater\Name with Spaces.txt 19800676
c:\DeleteLater\NoSpacesLongName.txt 21745440
c:\DeleteLater\Folder with Spaces\2nd Name with Spaces.txt 5805492
c:\DeleteLater\Folder with Spaces\2ndNoSpacesLongName.txt 3870322
c:\DeleteLater\FolderNoSpaces\3rd Name with Spaces.txt 27874695
c:\DeleteLater\FolderNoSpaces\3rdNoSpacesLongName.txt 28726032

대안 # 2 : FOR / F

BrianAdkins의 제안 : @echo off & for /f %a in ('dir /s /b') do echo %~fa %~za

수정 대답 입니다 :

@echo off & for /f "delims=*" %A in ('dir /s /b') do echo %~fA %~zA 

더 완전한 파일로 억제 디렉토리와 출력 (추가)와 대답은 :

@echo Results on %DATE% for %CD% >> YourDirFile.txt & echo off & for /f "delims=*" %A in ('dir /s /b /a:-d') do echo %~fA %~zA >> YourDirFile.txt

참고 : "delims = *"는 파일 이름에 허용되지 않는 문자를 지정합니다.
참고 : 두 번째 명령은 / a : -d를 통해 디렉토리를 표시하지 않습니다.
참고 : 다른 변수 이름을 선택할 경우 변수와 변수 매개 변수의 구분을 명확히하기 위해 FOR 변수 이름을 대문자로 만들었습니다.
참고 : OP가 파일에 대한 출력을 요청함에 따라 grins만을 위해 파일에 추가되었습니다.

ECHO의 상태를 실제로 확인하고 재설정해야한다고 가정합니다.

문제-이름의 공백

Brian의 제안 된 솔루션은 공백이 포함 된 파일 및 폴더 이름을 처리하지 않습니다 (적어도 Vista 구성에는 해당되지 않음).

예-잘못됨 (delims 없음; OP 당 디렉토리를 억제하지만 강조하기 위해 파일 이름 앞뒤에 크기가 모두 포함됨)

잘린 이름 및 크기 (6 개 중 4 개 파일이 잘못됨) :

@echo off & for /f %A in ('dir /s /b /a:-d') do echo %~zA %~fA %~zA
 C:\DeleteLater\Name
21745440 C:\DeleteLater\NoSpacesLongName.txt 21745440
 C:\DeleteLater\Folder
 C:\DeleteLater\Folder
 C:\DeleteLater\FolderNoSpaces\3rd
28726032 C:\DeleteLater\FolderNoSpaces\3rdNoSpacesLongName.txt 28726032

예-수정 (파일에 추가되지 않고 화면에 출력되는 메모)

@echo off & for /f "delims=*" %A in ('dir /s /b /a:-d') do echo %~fA %~zA
C:\DeleteLater\Name with Spaces.txt 19800676
C:\DeleteLater\NoSpacesLongName.txt 21745440
C:\DeleteLater\Folder with Spaces\2nd Name with Spaces.txt 5805492
C:\DeleteLater\Folder with Spaces\2ndNoSpacesLongName.txt 3870322
C:\DeleteLater\FolderNoSpaces\3rd Name with Spaces.txt 27874695
C:\DeleteLater\FolderNoSpaces\3rdNoSpacesLongName.txt 28726032

대안 # 3 : FORFILES (견적 문제)

이 솔루션은 FORFILES 문서 ( forfiles /?) 의 마지막 두 예제와 똑같습니다 .

FORFILES /S /M *.doc /C "cmd /c echo @fsize"
FORFILES /M *.txt /C "cmd /c if @isdir==FALSE notepad.exe @file"

이 예제들을 결합하고 파일에 쓰면 답이 (거의) 생깁니다.

forfiles /s  /c "cmd /c if @isdir==FALSE echo @path @fsize" >>ForfilesOut.txt

경로는 출력에서 ​​따옴표로 묶여 있습니다. 또는 전환
여부는 중요하지 않습니다 . 각 디렉토리를 구분하는 빈 줄을 추가하면 IF의 간단한 확장이 될 것입니다.echo onecho off

주의 : 마스크/m *.*를사용하면확장자가없는 파일 (예 : 마지막 파일)이 반환되지 않습니다!

Aside :
forfiles /s /c "cmd /c if @isdir==FALSE echo @path @fsize >>ForfilesSubOut.txt"OP는 원하는 것이 아니라 때로는 편리한디렉토리의 내용으로 각 디렉토리에 파일을 씁니다.

예-작동합니다 (따옴표로 전체 경로가 있음)

forfiles /s  /c "cmd /c if @isdir==FALSE echo @path @fsize"

"c:\DeleteLater\Name with Spaces.txt" 19800676
"c:\DeleteLater\NoSpacesLongName.txt" 21745440
"c:\DeleteLater\Folder with Spaces\2nd Name with Spaces.txt" 5805492
"c:\DeleteLater\Folder with Spaces\2ndNoSpacesLongName.txt" 3870322
"c:\DeleteLater\FolderNoSpaces\3rd Name with Spaces.txt" 27874695
"c:\DeleteLater\FolderNoSpaces\3rdNoSpacesLongName.txt" 28726032
"c:\DeleteLater\MoreFiles\A really really long file name that goes on and on 123456789 asdfghjkl zxcvnm qwertyuiop and still A really really long file name that goes on and on 123456789 qwertyuiop and still further roughly 225 characters by now.txt" 447
"c:\DeleteLater\MoreFiles\New Text Document no extension" 0

이 예에는 파일 이름이 매우 긴 추가 디렉토리와 확장자가없는 파일 이름이 포함됩니다.

문제 : 견적의 경로

따라서 OP 예제 당 원하지 않는 따옴표를 제거하고 대안 # 3 : FORFILES를 저장하는 쉬운 방법이 있습니까? (수사적 질문 : 따옴표는 기능이나 결함입니까?)



1
powershell "dir | select name,length"

이것은 OP 질문에 부정 행위 일 수 있습니다. 그러나이 문제는 더 이상 최신 Windows 기반 시스템과 관련이 없습니다. Dir 별칭은 논리적 링크를 그리는 데 사용되었습니다.


2
나는 이것을 시도했다 (Windows 7). 20 개의 항목이있는 디렉토리에서 실행하는 데 30 초가 걸렸으며 하위 디렉토리로 내려 가지 않았습니다.
Scott

재귀를하려면 다음으로 변경하십시오. powershell "Get-ChildItem -Recurse| select name,length"
giorgiomugnaini

0

아래는 네트워크 드라이브에서 너무 많은 공간을 차지하는 기타 비디오 파일을 찾고 결과를 로컬 PC의 텍스트 파일에 쓰는 데 사용한 것입니다.

세 가지 이유로 내 답변이 다소 늦었습니다. 하나, 나는 간결한 답변을 좋아합니다. 둘째,이 한 줄의 스크립트는 네트워크를 포함하여 여러 설정에서 작동했습니다. Brian Adkins의 답변에 따르면 Don Vince의 잠재적으로 모호한 의견에 따라 토큰을 사용하면 파일 이름에 공백이있는 파일 이름의 문제를 무시할 수 있습니다.

for /f "tokens=*" %%a in ('dir H:\*.mov H:\*.avi H:\*.wmv H:\*.mp4 /s /b') do echo %%~fa %%~za >> C:\Temp\VideoList.txt

매우 긴 파일 경로 / 파일 이름 (수백 자)으로도 오류가 발생할 수 있지만 검색이 중단되지는 않습니다. 그러나 경로는 대상에 대해 완전히 탐색되지 않았습니다. 일단 언급하면이 오류를 제거하기 위해 폴더 구조를 더 깊이 시작하여 보상 할 수 있습니다.

이 페이지 ss64dir 명령 의 사용법을 잘 보여주고 모든 스위치, 많은 스위치 조합을 나열하고 적절한 구문의 유용한 예를 보여줍니다. 다양한 Stack Exchange 커뮤니티만큼 포괄적이지는 않지만 명령 줄 / 배치 스크립팅에 익숙해지면 프레젠테이션에 명확한 명확성이 있습니다.


0

다음 명령으로 이에 도달했습니다.

(for /R "\path\to\directory\" %A in (*.*) do echo %~fA %~zA) | findstr /v "echo"

결과:

D:\Users\Natasha>(for /R ".\" %A in (*.*) do echo %~fA %~zA) | findstr /v "echo"


D:\Users\Natasha\Flowers_ (12).jpg 118886

D:\Users\Natasha\SomeFolder\data.txt 1241

D:\Users\Natasha\SomeFolder\CS\Counter-Strike_1.6.exe 272645624

PS 이것은 BillR (대체 # 1)의 회신을 기반으로합니다. 그러나 제 경우에는와 함께 중단됩니다 @echo off.


0

"du"명령이 매우 유용하고 Windows와 Unix에서 모두 작동합니다 (Windows PC에서 Linux 웹 서버로 많은 데이터를 전송할 때 모든 파일이 복사되었는지 확인하는 데 사용됨).

du -ah "C:\your_dir" > "C:\file_list.txt"

출력 :

15  C:\your_dir/.htaccess
608 C:\your_dir/folder/hello.txt
1.0 C:\your_dir/folder/subfolder/test.txt
1.0 C:\your_dir/folder/subfolder
1.2M    C:\your_dir/folder/world.txt
1.2M    C:\your_dir/folder
9.0 C:\your_dir/no_file_ending
11  C:\your_dir/sample document 1.txt
684K    C:\your_dir/sample document 2 - äöüßÄÖÜáà.txt
1.9M    C:\your_dir

그러나 메모장 ++이 아닌 메모장에서 특수 문자 만 올바르게 볼 수 있습니다 (지금은 정확하게 분석 할 시간이없는 ANSI / UTF-8 인코딩이어야 함). 또한 파일 이름 뒤에 크기를 표시하는 솔루션을 찾지 못했습니다. "h"대신 "b"또는 "k"옵션을 사용하여 크기를 바이트 또는 킬로바이트 단위로 표시하십시오. 분석하려는 폴더 외부에서 명령을 실행할 때 문제가 발생했습니다. 따라서 올바른 디렉토리에 명령을 입력하고 (이 예에서는 "C : \ your_dir") 명령에 지정하는 것이 가장 좋습니다.


-1

dir / b / s / a : -D> results.txt에서 b를 생략하면 결과는 다음과 같아야합니다 (예 : dir / s / a : -D> results.txt).

드라이브 H의 볼륨은 파일입니다. 볼륨 일련 번호는 C9EB-112E입니다.

H : \ Files의 디렉토리

09/29/2014 11:36 오후 0 testing.txt 1 파일 0 바이트

H : \ Video \ Action \ Comix 디렉토리

2012 년 10 월 6 일 09:51 오전 184,740 file1.txt 07/20/2012 06:21 오전
864,832 file2.txt 08/31/2009 08:47 오후 606,638 file3.txt 08/31/2009 09:07 오후 160,320 파일 4 .txt


이것은 원래 질문에 대한 답변 이 아닙니다 . OP가 요청한 출력을 생성하지 않습니다.
DavidPostill

-1
where * /t  

지나치게 복잡하지 않으면 서 원하는 출력을 얻을 수 있습니다. OP가 요구 한 것보다 조금 더 많은 것을 줄 것이지만 언급 할 가치가 있다고 생각했습니다. 현재 이외의 디렉토리를 지정하려면 / R 스위치를 추가하십시오.


1
시도한대로 답변이 업데이트되고 확인되는 것을 고려하고 오류 메시지가 표시 ERROR: Invalid syntax. Value expected for '/r'되므로 드로잉 보드로 돌아가 올바른 구문을 제공 하고 정확한 세부 사항으로 답변을 편집 하십시오.
Pimp Juice IT

값을 입력하십시오 ... / R은 디렉토리 스위치이며, 기본값을 현재 디렉토리로 두십시오.
someguy

"OP가 요구 한 것보다 조금 더 많은 것을 줄 것입니다." 농담 해?  where /?“기본적으로 검색은 현재 디렉토리 와 PATH 환경 변수에 지정된 경로에서 수행됩니다 . ”— where * /t명령은에있는 모든 파일 C:\Windows\System32,의 일부 하위 디렉토리 C:\Program Files및에있는 다른 모든 디렉토리를 나열합니다 PATH. 저에게는 3000 줄 이상이었습니다. 합리적으로 답변을 수정하십시오. PS Without  /R는 재귀 적이 지 않습니다.
Scott

어디 / R *. *는 나를 위해 일했다. / R 지정된 위치 (이 경우 현재 디렉토리)에서 재귀 적으로 검색하도록 지시합니다. *. *는 일치하는 패턴입니다. WHERE / R % USERPROFILE % * .docx는 사용자 폴더의 모든 단어 파일을 표시합니다. (이 주석에서 \로 *를 피해야 함)
DHW
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.