Nhận tên tập tin trần đệ quy trong dấu nhắc lệnh


19

Tôi đã gặp một chút khó khăn khi chỉ cố gắng lấy tên tệp (không có phần mở rộng hoặc đường dẫn tệp). Điều này làm việc cho tôi trong thư mục gốc:

dir /b

Nhưng khi tôi thêm / s để quét đệ quy tôi cũng có đường dẫn tệp trước tên tệp mà tôi không muốn. Có cách nào để có được tên tệp trần từ tất cả các thư mục con trong một thư mục không?

Im trên Windows 7 x64 Tôi muốn sử dụng dấu nhắc lệnh thông thường chứ không phải PS hoặc VBS

Câu trả lời:


15

Sử dụng lệnh sau:

dir /b /a /s
  • / b tước ngày và các chi tiết khác từ đầu ra
  • / a chỉ xuất tên tệp, không có đường dẫn
  • / s cho phép một danh sách thư mục đệ quy

Nếu bạn cần lưu đầu ra vào một tệp, bạn có thể sử dụng:

dir /b /a /s >> list_of_names.txt

EDIT Trên thực tế, giải pháp trên không đạt được mục tiêu của câu hỏi ban đầu. Một điều tôi đã nhận thấy từ câu hỏi là bài đăng yêu cầu liệt kê đệ quy. mà câu trả lời khác thiếu nên tôi nghĩ việc thêm "/ s" vào câu trả lời của người trả lời khác sẽ thực hiện được mẹo

for /f %a in ('dir /b /s') do @echo %~na

Bạn có thể giải thích điều này? Đối với tôi nó có ý nghĩa rất nhỏ.
Simon Sheehan

4
Điều này không hoạt động, / a không hoạt động như thế - đó là một bộ lọc cho loại tệp bạn muốn liệt kê. Nó không loại bỏ đường dẫn từ tên tệp khi thực hiện danh sách thư mục đệ quy.
Gaff

chỉnh sửa câu trả lời; và chỉ cần chạm tay vào một ô cửa sổ một lần nữa, tôi nghĩ lần này nên làm điều đó (win732bit)
Nik So

6

Thử đi:

for /f "delims=" %a in ('dir /b /s') do @echo %~na

Thông tin thêm về cách thức hoạt động và những gì nó đang làm, gõ for /?


Điều này gần như hoạt động nhưng có một vấn đề lớn. Nó chỉ xuất ra từ đầu tiên của tên tệp. Nếu tên tệp là ví dụ "hình ảnh kỳ nghỉ của tôi 1" thì nó chỉ xuất ra "của tôi"
TMRW

hãy thử điều này: for / f "delims = |" % a in ('dir / b') làm @echo% ~ na. Theo mặc định, tham số / f của FOR sẽ mã hóa trên khoảng trắng. Đặt mã thông báo thành ký tự không xuất hiện trong tên tệp / thư mục sẽ cung cấp cho bạn toàn bộ tên bao gồm cả khoảng trắng.
Scott McKinney

Nếu bạn muốn đầu ra được gửi đến một tệp, hãy nối thêm>> filename.txt
Gruber

2
for /r %i in (*) do @echo %~ni

hoặc là

forfiles /s /c "cmd /c if @isdir==FALSE noquotes.bat @fname"

giả sử một tệp noquotes.battrong % PATH% của bạn với nội dung này

@echo %~1

giải thích cho / r cách tiếp cận

for /rđi theo thư mục hiện tại một cách đệ quy (bạn có thể chỉ định một thư mục for /r drive:\path\, thư mục hiện tại được giả sử) và thực thi lệnh được chỉ định bằng cách thực hiện cho mỗi tệp khớp trong tập hợp (*). Các tập hợp (.)sẽ chỉ phù hợp với các thư mục. @echo% ~ ni Lệnh này hoạt động như là từ dấu nhắc. Nhân đôi dấu ngoặc kép của bạn nếu bạn đặt nó trong một tệp bó. I Efor /r %%i in (*) do @echo %%~ni

giải thích cách tiếp cận

/sliệt kê hiện tại và tất cả các thư mục con
/cthực thi lệnh bên trong dấu ngoặc kép
@isdir@fnamelà một biểu tượng được phát ra trong chuỗi lệnh
Tập tin lô bổ sung noquotes.batgiúp bằng cách tước dấu ngoặc kép với% ~ 1 (tham số 1)
forfilescũng cho phép bạn chỉ định đường dẫn bắt đầu tạiforfiles /P C:\Windows ...


@DavidPostill vâng, đó là một câu trả lời kém. Cảm ơn ý kiến ​​của bạn. Xin vui lòng cho tôi biết nếu tôi có thể cải thiện câu trả lời của tôi hơn nữa.
JJS

@DavidPostill bạn không có câu trả lời hoặc nhận xét trước đó. bạn đang kiểm duyệt các câu hỏi, hoặc tìm kiếm một câu trả lời và vấp phải câu trả lời kém chất lượng của tôi?
JJS

Câu trả lời của bạn xuất hiện trong hàng đánh giá "Bài viết chất lượng thấp". Vì tôi biết rất nhiều về các tập tin bó, tôi đã xem kỹ nó.
DavidPostill

@DavidPostill cảm ơn bạn đã đánh giá. Tôi hoan nghênh đánh giá của bạn về những thay đổi tôi đã thực hiện cho câu trả lời của tôi.
JJS

Tốt hơn nhiều ... :)
DavidPostill

-1

Liệt kê tất cả các tệp, để trần, đệ quy, sử dụng các thuộc tính (không phải thư mục) (chỉ các tệp)

thư mục / B / S / A: -D

C: \ test \ cache> dir / B / S / A: -D

C: \ test \ cache \ 7 \ 0f \ 7b50ed0522645513da90345120eaf0f7 C: \ test \ cache \ d \ 23 \ 814644aa6a8195c91e54d2f7bb64e23d


Câu hỏi nói rằng OP đang cố gắng chỉ lấy tên tệp (không có phần mở rộng hoặc đường dẫn tệp). Nhưng tôi đã cố gắng dir /b /squét đệ quy, tôi cũng có đường dẫn tệp trước tên tệp mà tôi không muốn. Vì vậy, bạn đang nói với OP hãy thử một biến thể tầm thường trên những gì họ đã thử và câu trả lời của bạn chứng minh rằng nó tạo ra kết quả tương tự như khi OP thử nó (nghĩa là không phải những gì họ muốn).
Scott
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.