Sử dụng ký tự đại diện với lệnh rmdir hoặc nd


40

Giả sử có một số thư mục trong D: ổ đĩa:

D:\Air
D:\Abonden
D:\All
D:\Whatever

Tôi muốn xóa tất cả các thư mục bắt đầu bằng "A" (bao gồm tất cả các thư mục con và tệp). Tôi đã thử lệnh này:

rmdir D:\A* /s /q

Tôi gặp lỗi, mặc dù :(

Tên tệp, tên thư mục hoặc cú pháp nhãn âm lượng không chính xác.

Các dellệnh làm việc với *, nhưng tôi cần phải xóa thư mục là tốt.
Có cách nào để đạt được điều đó thông qua rmdirlệnh?


2
Tính đồng nhất và lẽ thường không bao giờ có trong quá trình phát triển các shell lệnh của Windows hoặc DOS. Điều đáng buồn là có những hệ thống mô hình ngoài kia khi những chiếc vỏ này được phát triển sẽ làm sáng tỏ các thiết kế thông minh. Tất nhiên cái vỏ chỉ là một ví dụ về quá trình suy nghĩ kinh khủng đến không tồn tại đã đổ vào đống rác này - tôi ước tôi có thể nói cho bạn biết tôi thực sự nghĩ gì, ha ha.
Rick O'Shea

Câu trả lời:


33
cd c:\temp
for /f %i in ('dir /a:d /s /b A*') do rd /s /q %i

Sử dụng điều này để kiểm tra mặc dù:

for /f %i in ('dir /a:d /s /b A*') do echo rd /s /q %i

Điều này sẽ loại bỏ các lệnh sẽ được chạy vào dấu nhắc lệnh và cho phép bạn xem những gì đang diễn ra.

Hãy nhớ rằng điều này cũng sẽ tìm kiếm các thư mục con như "C: \ temp \ jjj \ aaa" và sẽ xóa thư mục aaa. Nếu bạn muốn nó chỉ nhìn vào các thư mục cấp cao nhất "C: \ temp \ aaa", sau đó xóa lệnh "/s"khỏi lệnh.

Chìa khóa cho điều này là A *, nơi bạn sẽ đặt trong chuỗi tìm kiếm của mình. Điều này sẽ chấp nhận các ký tự đại diện như aaa*, aaa**aaa*nếu bạn muốn nó.


Như vậy, lệnh sẽ bị hỏng nếu tên đường dẫn / thư mục chứa các ký tự khoảng trắng.
và31415

1
Chúng tôi có thể thêm "NẾU KHÔNG EXIST goto EFO" cho A * không?
serdar

3
Điều này hoạt động nếu đường dẫn chứa ký tự không gian: for / f "delims ="% i in ('dir / a: d / s / b A *') dord / s / q "% i"
Luis Cantero - MSFT

5
Tôi chỉ muốn nói thêm rằng nếu chạy nó từ trong một tệp bó thì bạn cần sử dụng hai dấu phần trăm để lệnh trở thànhfor /f %%i in ('dir /a:d /s /b A*') do rd /s /q %%i
Fred Clausen

không cần sử dụng cờ 'w / sub' hai lần :)
lunicon

25

Xóa các thư mục bằng cách sử dụng ký tự đại diện

Lệnh rmdir/ rdmột mình không hỗ trợ các ký tự đại diện (nghĩa là *?). Bạn có thể giải quyết giới hạn này bằng cách gói nó trong một forvòng lặp.

Ví dụ sử dụng

for /d %G in ("X:\A*") do rd /s /q "%~G"

Lưu ý Khi bạn đang xóa các tệp và thư mục, bạn có thể muốn thay thếrd lệnh echo. Bằng cách này, bạn có thể đảm bảo mọi thứ không nên xóa thực sự sẽ xảy ra.

Nhiều mẫu

Để xóa nhiều thư mục khớp với các mẫu khác nhau, cú pháp không quá khác nhau. Như @dbenham đã chỉ ra một cách chính xác, lệnh một dòng là đủ. Bạn cũng có thể chỉ định các đường dẫn khác nhau:

for /d %G in ("X:\A*","Y:\Whatever\B*","Z:\C?D") do rd /s /q "%~G"

Phần thưởng - Kiểm tra sự tồn tại của thư mục

Trong trường hợp bạn muốn kiểm tra xem các thư mục cụ thể có tồn tại hay không, bạn có thể sử dụng lệnh sau:

dir /b /a:d "X:\A*" >nul 2>&1 && echo Folders exist. || echo No folders found.

đọc thêm


Chúng tôi có thể thêm "NẾU KHÔNG EXIST goto EFO" cho A * không?
serdar

Ví dụ, chúng tôi cho rằng không có thư mục bắt đầu bằng chữ A. Vì vậy, lệnh phải đi cho B *. Tôi không biết mình có thể giải thích hay không :(
serdar

1
+1 từ tôi. Tôi không hiểu phiếu bầu. Mặc dù bạn có thể thực hiện nhiều mẫu với các lệnh FOR /Dvà đơn giản của bạn FOR /D /R. Đơn giản chỉ cần sử dụng in( "A*" "B*" "C?D" ).
dbenham

1
Trên thực tế, bạn cần có /Rtùy chọn vì thư mục con phù hợp với mặt nạ có thể nằm dưới cha mẹ không.
dbenham

5
CẢNH BÁO: Nếu bạn muốn sử dụng giải pháp này trong tệp .bat, bạn phải sử dụng %% G thay vì% G, xem tại đây
ValarDohaeris

18

Làm thế nào chưa ai nói với OP về forfiles?!

forfiles /P D:\ /M A* /C "cmd /c if @isdir==TRUE rmdir /s /q @file"

/ P là tên đường dẫn - nơi bắt đầu tìm kiếm
/ M là mặt nạ tìm kiếm, tìm kiếm các tệp bắt đầu bằng A
/ C là lệnh thực thi
/ S là các thư mục con đệ quy (không bao gồm ở đây, vì op không hỏi)

2
Đây là một câu trả lời tuyệt vời, nên được chấp nhận.
eacousineau

1
Giải pháp rất tốt và giải thích tốt.
Andreas

Câu trả lời hữu ích: D nhưng IMO for /dnhư trong câu trả lời của and31415 vừa sạch hơn vừa hiệu quả hơn.
Superole

12

Câu trả lời của adn31415 là đúng nhưng sẽ bị hỏng nếu bạn đặt câu hỏi này trong tập lệnh bó hoặc cmd. Tôi đập đầu mình hàng giờ cho đến khi tôi nhận ra đây là cách bạn sử dụng nó.

Trong cửa sổ lệnh DOS:

for /d %G in ("X:\A*") do rd /s /q "%~G"

Trong tập lệnh Batch hoặc cmd:

for /d %%G in ("X:\A*") do rd /s /q "%%~G"

Nếu bạn muốn đặt nó vào tệp ".bat" hoặc ".cmd", bạn cần nhân đôi ký tự "%".


3
Bạn đã tiết kiệm thời gian của tôi cho kịch bản Batch!
Tuấn

không có vấn đề gì :) Đó là lý do tại sao đăng câu trả lời vì tôi biết nó không rõ ràng và nhiều người sẽ gặp phải nó.
Sam B

Chúng tôi có thể thêm một loại trừ không bị xóa?
serdar

SET / P PC = ENTER IP HOẶC TÊN HOST cho / d %% a trong ("\\% PC% \ D $ \ A *. *") Do rd / s / q "%% a" Liệu đoạn văn bản này có hoạt động đúng không ?
serdar
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.