Liệt kê các tệp đệ quy chỉ hiển thị đường dẫn và kích thước tệp đầy đủ từ Windows Command Prompt


50

Tôi đang cố gắng tạo một tệp văn bản chứa tên tệp (bao gồm đường dẫn đầy đủ) và kích thước tệp cho tất cả các tệp trong một thư mục cụ thể và bất kỳ thư mục con nào của nó (tức là đệ quy). Lý tưởng nhất là tôi không muốn có dấu phẩy ở kích thước tệp (nhưng tôi sẽ giải quyết chúng!)

Lệnh sau thực hiện nhưng không có kích thước tệp:

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

Một ví dụ đầu ra sẽ như thế nào:

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

Tôi không nghĩ rằng điều này là có thể khi sử dụng dirmột mình, mặc dù tôi rất muốn được chứng minh là sai. Có cách nào khác để làm điều này không, chỉ sử dụng các lệnh có sẵn từ Dấu nhắc Lệnh?

Câu trả lời:


28

Điều này nên làm điều đó:

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

Nó không hiệu quả lắm ... việc chạy nó cho các thư mục chứa hàng tấn tệp có thể còn sơ sài, vì vậy hãy thử nó trên các thư mục nhỏ trước.

Từ "cho /?" văn bản trợ giúp (Tôi đã sử dụng 'a' thay vì 'I')

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
Tôi đã gặp một trở ngại nhỏ khi sử dụng: các tệp có khoảng trắng trong tên tệp không được đăng ký chính xác. Để khắc phục điều này, tôi đã thêm một "tokens=*"như sau@echo off & for /f "tokens=*" %a in ('dir /s /b') do echo %~fa %~za
Don Vince

Làm thế nào để in nó vào một txttập tin?
Saeed Neamati

3
Nó nên làfor /r %a in (*) do echo %~fa %~za
ZAB

1
@Saeed Neamati - Đây là một ví dụ >> C:\Temp\VideoList.txt- Kết quả của bất kỳ quy trình nào trước đây được ghi ra tệp văn bản có tên VideoList . Sử dụng một > sẽ ghi đè lên tệp ( nếu nó đã tồn tại ) và sử dụng >> sẽ nối thêm kết quả mới vào cuối nếu tệp văn bản ( nếu nó đã tồn tại ). Nếu tệp văn bản chưa tồn tại, lệnh này sẽ ghi một tệp mới với tên được chỉ định.
dùng23715

điều này đã cho tôi danh sách các tệp * .dwg, thay đổi kích thước tệp, thành tệp văn bản:@echo off & for /f "tokens=*" %a in ('dir *.dwg /s /b') do echo %~fa >>dwgfiles.txt
CAD bloke

14

Giải pháp thay thế số 1: FOR / R trực quan hơn # 2 đối với tôi.
Giải pháp thay thế số 2: FOR / F khắc phục sự cố với "khoảng trắng trong tên" trong đề xuất của BrianAdkins.
Giải pháp thay thế số 3: FORFILES sẽ là lựa chọn của tôi ngoại trừ đường dẫn nằm trong dấu ngoặc kép.

Brian hoặc các bậc thầy khác có thể có một giải pháp thanh lịch hơn hoặc có thể đề xuất hàng tá giải pháp khác nhưng ba công việc này. Tôi đã thử sử dụng FOR TOKENS nhưng sau đó phải loại bỏ các tiêu đề và chân trang để tôi quay trở lại # 1. Tôi cũng đã xem xét việc tạo một tệp .bat nhỏ và gọi nó nhưng nó thêm một tệp khác (mặc dù nó cung cấp tính linh hoạt cao hơn, như là một chức năng).

Tôi đã thử nghiệm tất cả các lựa chọn thay thế với thư mục và tên tệp với các khoảng trắng được nhúng, tên tệp 200 ký tự, tên tệp không có phần mở rộng và trên thư mục gốc của một ổ đĩa nhỏ (chỉ trong thời gian; hơi chậm - như Brian đã đề xuất - nhưng sau đó thì như vậy đang tìm kiếm trong Windows Explorer, đó là lý do tại sao tôi cài đặt ứng dụng Tìm kiếm mọi thứ).

Phương án số 1: CHO / R

Tốt nhất (?) Trong khi cố gắng tìm ra lý do tại sao giải pháp của Brian không hiệu quả với tôi, tôi đã xem TRỢ GIÚP và quyết định thử phương pháp / R. (Tạo một tệp sẽ giống như trong Phương án số 2.)

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

Ví dụ - Công trình (thư mục khác với ở trên để thể hiện đệ quy)

@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

Phương án số 2: CHO / F

Đề xuất của BrianAdkins: @echo off & for /f %a in ('dir /s /b') do echo %~fa %~za

Một câu trả lời đúng là:

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

Một câu trả lời đầy đủ hơn với các thư mục bị chặn và xuất ra (nối thêm) vào một tệp là:

@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

Lưu ý: "delims = *" chỉ định một ký tự không được phép trong tên tệp.
Lưu ý: Lệnh 2 cũng chặn các thư mục thông qua / a: -d.
Lưu ý: Tạo chữ hoa tên biến FOR để làm rõ sự khác biệt giữa các tham số biến và biến nếu ai đó chọn các tên biến khác nhau.
Lưu ý: Được thêm vào tệp chỉ cho các nụ cười khi OP yêu cầu xuất ra tệp.

Tôi cho rằng tôi thực sự nên kiểm tra trạng thái của ECHO và thiết lập lại nó.

Vấn đề - Dấu cách trong tên

Giải pháp đề xuất của Brian không xử lý tên tệp và thư mục chứa khoảng trắng (ít nhất là không phải trên cấu hình Vista của tôi).

Ví dụ - Sai (Không có độ trễ; Bao gồm thư mục chặn trên mỗi OP nhưng với kích thước cả trước và sau tên tệp để nhấn mạnh)

Tên và kích thước bị cắt bớt (4 trong số 6 tệp không chính xác):

@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

Ví dụ - Chính xác (Lưu ý đầu ra ra màn hình, không được thêm vào tệp)

@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

Giải pháp thay thế số 3: FORFILES (Trích dẫn vấn đề)

Giải pháp này trực tiếp từ hai ví dụ cuối cùng trong tài liệu FORFILES ( forfiles /?).

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

Kết hợp các ví dụ này và viết vào một tệp mang lại câu trả lời (gần như):

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

Lưu ý rằng đường dẫn nằm trong dấu ngoặc kép ở đầu ra.
Không quan trọng là có echo onhay không echo off.
Thêm một dòng trống ngăn cách mỗi thư mục sẽ là một phần mở rộng tầm thường của IF.

Thận trọng : Sử dụng mặt nạ/m *.*sẽ không trả lại các tệp mà không có phần mở rộng (ví dụ như tệp cuối cùng)!

Ngoài ra : Điều này ghi một tệp trong mỗi thư mục có nội dung của thư mục đó:
forfiles /s /c "cmd /c if @isdir==FALSE echo @path @fsize >>ForfilesSubOut.txt"Không phải những gì OP muốn nhưng đôi khi tiện dụng.

Ví dụ - Hoạt động (nhưng với fullpath trong dấu ngoặc kép)

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

Ví dụ này bao gồm một thư mục bổ sung có tên tệp siêu dài và tên tệp không có phần mở rộng.

Vấn đề: Đường dẫn trong ngoặc kép

Vì vậy, có một cách dễ dàng để loại bỏ các trích dẫn không mong muốn (?) Trên ví dụ OP và lưu Phương án số 3: FORFILES. (Câu hỏi tu từ: Các trích dẫn là một tính năng hay một lỗ hổng?)


1

Tôi nhận ra điều này đòi hỏi một sự tiện lợi thêm , nhưng bạn có thể đạt được điều này khá ngắn gọn bằng cách sử dụng tiện ích sfk :

sfk cwd +run -yes "sfk list -size -tab $qfile +toclip"

sfk fromclip > C:\_temp\sfk_list_output.txt

(Tôi có cách tiếp cận bằng cách sử dụng lệnh sfk ở đây )


1
powershell "dir | select name,length"

Điều này có thể gian lận trong câu hỏi của OP. Tuy nhiên, câu hỏi không còn phù hợp trên các hệ thống dựa trên Windows hiện đại. Bí danh Dir được sử dụng để giúp vẽ liên kết logic.


2
Tôi đã thử điều này (Windows 7). Phải mất hơn 30 giây để chạy (trên một thư mục có 20 mục) và nó không rơi vào các thư mục con.
Scott

Để có đệ quy xin vui lòng đổi thành: powershell "Get-ChildItem -Recurse| select name,length"
giorgiomugnaini

0

Dưới đây là những gì tôi đã sử dụng để xác định vị trí các tệp video linh tinh đang chiếm quá nhiều chỗ trên ổ đĩa mạng và ghi kết quả vào tệp văn bản trên PC cục bộ.

Tôi đang đăng câu trả lời hơi muộn của mình vì ba lý do. Một, tôi thích câu trả lời súc tích. Hai, dòng script đơn này hoạt động trong nhiều cài đặt cho tôi, bao gồm cả trên một mạng. Ba, theo nhận xét có khả năng tối nghĩa của Don Vince theo câu trả lời của BrianAdkins, sử dụng mã thông báo có thể bỏ qua các vấn đề từ tên tệp có khoảng trắng trong đó.

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

Tôi nhận thấy rằng các đường dẫn tệp / tên tệp rất dài (hàng trăm ký tự) cũng có thể gây ra lỗi nhưng tìm kiếm sẽ không bị treo trên đó. Tuy nhiên, đường dẫn vẫn chưa được khám phá đầy đủ cho (các) mục tiêu của bạn. Sau khi lưu ý, bạn có thể bù bằng cách bắt đầu sâu hơn vào cấu trúc thư mục để loại bỏ lỗi này.

Trang ss64 này có phần trình bày rất tốt về việc sử dụng lệnh dir , liệt kê tất cả các công tắc, nhiều tổ hợp chuyển đổi và hiển thị một số ví dụ hữu ích về cú pháp thích hợp. Nó không toàn diện như các cộng đồng Stack Exchange khác nhau nhưng có một sự rõ ràng nhất định trong bản trình bày một khi bạn cảm thấy thoải mái với tập lệnh dòng lệnh / tập lệnh.


0

Tôi đã đạt được điều này với lệnh sau:

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

Kết quả:

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 Điều này dựa trên câu trả lời của BillR (Phương án số 1). Tuy nhiên trong trường hợp của tôi nó bị treo với @echo off.


0

Tôi thấy lệnh "du" khá hữu ích và nó hoạt động trên cả Windows và Unix (đã sử dụng nó để kiểm tra xem tất cả các tệp có được sao chép khi chuyển nhiều dữ liệu từ PC Windows sang Linux Web Server không):

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

đầu ra:

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

Tuy nhiên, tôi chỉ có thể thấy chính xác các ký tự đặc biệt trong Notepad, không phải trong Notepad ++ (phải là một số điều Mã hóa ANSI / UTF-8, không có thời gian để phân tích chính xác ngay bây giờ). Ngoài ra, tôi đã không tìm thấy một giải pháp để hiển thị kích thước sau tên tập tin. Sử dụng các tùy chọn "b" hoặc "k" thay vì "h" để hiển thị kích thước theo byte hoặc kilobyte. Tôi gặp một số rắc rối khi chạy lệnh bên ngoài thư mục mà tôi muốn phân tích. Vì vậy, tốt nhất cả hai nhập lệnh trong thư mục bên phải ("C: \ your_dir" trong ví dụ này) và chỉ định nó trong lệnh.


-1

Bỏ qua b trong dir / b / s / a: -D> results.txt và kết quả sẽ như thế nào, (tức là dir / s / a: -D> results.txt):

Âm lượng trong ổ H là TẬP SỐ Số sê-ri là C9EB-112E

Thư mục của H: \ Files

29/11/2014 11:36 PM 0 tests.txt 1 Tệp 0 byte

Thư mục của H: \ Video \ Action \ Comix

10/06/2012 09:51 AM 184,740 file1.txt 07/20/2012 06:21 AM
864.832 file2.txt 08/31/2009 08:47 PM 606.638 file3.txt 08/31/2009 09:07 PM 160.320 file4 .txt


Đây không phải là một câu trả lời cho câu hỏi ban đầu. Nó không tạo ra đầu ra mà anh OP yêu cầu.
DavidPostill

-1
where * /t  

Không quá phức tạp, điều này sẽ tạo ra đầu ra mong muốn. Nó sẽ cung cấp nhiều hơn một chút so với OP yêu cầu, nhưng tôi nghĩ rằng nó đáng được đề cập. Thêm công tắc / R để chỉ định một thư mục khác ngoài hiện tại.


1
Xem xét cập nhật và xác nhận câu trả lời của bạn hoạt động khi tôi đã thử và nhận được thông báo lỗi ERROR: Invalid syntax. Value expected for '/r'vì vậy hãy xem xét quay lại bảng vẽ và cung cấp cú pháp chính xác và chỉnh sửa câu trả lời của bạn với chi tiết chính xác.
Pimp Juice IT

Xem xét nhập giá trị ... / R là chuyển đổi thư mục, mặc định là thư mục hiện tại nếu bạn bỏ nó.
someguy

Phần mềm sẽ cung cấp nhiều hơn một chút so với OP yêu cầu. Bạn đang giỡn đấy à?  where /?Nói, theo mặc định, tìm kiếm được thực hiện dọc theo thư mục hiện tại và trong các đường dẫn được chỉ định bởi biến môi trường PATH . Ngay - vì vậy where * /tlệnh của bạn liệt kê mọi tệp trong C:\Windows\System32, một số thư mục con C:\Program Filesvà mọi thư mục khác trong PATH. Đối với tôi, đó là hơn 3000 dòng. Vui lòng xem xét chỉnh sửa câu trả lời của bạn để làm cho nó hợp lý. PS mà không  /R, nó không đệ quy.
Scott

Ở ĐÂU / R. *.* đã làm cho tôi. / R. nói để tìm kiếm đệ quy từ vị trí đã chỉ định (trong trường hợp này là thư mục hiện tại của nó). *. * Là mẫu phù hợp. Vì vậy, WHERE / R% USERPROFILE% * .docx sẽ hiển thị tất cả các tệp từ trong thư mục của người dùng. (Phải thoát * với \ trong những bình luận này)
DHW
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.