2010-11-14 52 views
20

Tôi có một số quy trình tạo ra một số tệp có kích thước 0KB trong một thư mục và các thư mục con của nó.
Làm cách nào để xóa các tệp khỏi hệ thống tệp bằng dấu nhắc lệnh windows?
Bất kỳ lệnh hoặc tập lệnh nào sẽ thực hiện tác vụ sẽ hoạt động. Đệ quy xóa các tệp 0KB bằng cách sử dụng các cửa sổ cmd


Tôi chỉ có thể chạy lệnh và lệnh cmd đơn giản, hoạt động trên máy từ xa có quyền truy cập bị giới hạn.

+1

Phiên bản nào của Windows? Nhiều phiên bản của Windows bao gồm VBScript có thể linh hoạt hơn ... http://www.suite101.com/content/windows-scripting-command-line-vbscript-a83052 – Klinky

+0

Tôi sẽ sử dụng 'for' để quét cây dir cho các tệp , 'findstr' để tìm kiếm tệp cho"."mô hình và xóa những người không phù hợp. – Constantin

Trả lời

42
  1. Lặp đệ quy trên tập tin:

    for /r %F in (*) 
    
  2. Tìm hiểu file zero-length:

    if %~zF==0 
    
  3. Xóa họ:

    del "%F" 
    

Đưa nó tất cả cùng nhau:

for /r %F in (*) do if %~zF==0 del "%F" 

Nếu bạn cần điều này trong một tập tin thực thi, thì bạn cần phải tăng gấp đôi %:

for /r %%F in (*) do if %%~zF==0 del "%%F" 

Lưu ý: tôi đã giả định rằng bạn có nghĩa là các tệp có độ dài chính xác là 0 byte. Nếu với 0 KB bạn có nghĩa là bất kỳ điều gì nhỏ hơn 1000 byte, thì trên if cần phải đọc if %~zF LSS 1000 hoặc bất kỳ ngưỡng nào của bạn.

+0

hmm đã làm việc nhờ :) – crodjer

+1

(Để hoàn thành) Cùng một lệnh tắt đầu ra: http: // stackoverflow. com/a/18014912/2436175 – Antonio

+0

Sử dụng '@ if' nếu bạn muốn ngăn chặn việc in câu lệnh if cho mỗi tệp – Kip

-1

Bạn có thể thử find.exe từ UnxUtils.

find . -type f -empty -delete 
+0

Nó không hữu ích cho mục đích này .... làm việc một máy từ xa ... do đó, không có truy cập trực tiếp. Chỉ có thể chạy lệnh cmd và script. – crodjer

+0

Tôi nghĩ rằng câu trả lời này không nên có được Nó vẫn cung cấp một chút thông tin hữu ích, có thể là trong các ngữ cảnh hơi khác nhau, được bình chọn để vô hiệu hóa nó – crodjer

2
@echo off 
setLocal EnableDelayedExpansion 
for /f "tokens=* delims= " %%a in ('dir/s/b/a-d') do (
if %%~Za equ 0 del "%%a" 
) 

Tìm thấy tại: link text dường như hoạt động, với một lời nhắc: Nó sẽ không xóa các tệp có tên có chứa dấu cách. Có thể có một công việc xung quanh, nhưng tôi sợ hàng loạt không phải là sở trường của tôi.

+0

Vâng, vì bạn khai báo rõ ràng dấu cách là dấu phân tách mã thông báo' for' * sẽ * mã hóa. '' '' %% a %% b ''sẽ hoạt động Nhưng câu trả lời thực tế là bạn không bao giờ nên sử dụng' for/f' trên đầu ra của 'dir' trừ khi nó là hoàn toàn cần thiết (ví dụ để phân loại). 'chính nó có thể lặp lại ove các tệp r và mạnh mẽ hơn theo cách đó. Ví dụ, giải pháp của bạn sẽ không xử lý các tên tệp có chứa các ký tự Unicode không có đại diện trong bảng mã OEM, nếu các phông chữ Raster được chọn cho cửa sổ bảng điều khiển. Những tương tác đó là tinh tế nhưng tôi có xu hướng tránh xa 'for/f' cho tên tệp – Joey

0

Tính năng này hoạt động tốt khi sửa lỗi chính tả. Vấn đề là dấu ngã bị thiếu (~) ví dụ: del "%% a" cần phải được xóa "%% ~ a"

Điều này thực sự sẽ xóa tệp có dấu cách trong tên vì nó bao quanh mã thông báo trong "gấp đôi dấu ngoặc kép" - một phương pháp thay thế sẽ được sử dụng 'tên viết tắt' như trong ví dụ thứ hai [%% ~ sa

@echo off setlocal EnableDelayedExpansion for/f "tokens = * delims =" %% một trong ('dir/s/b/a-d') làm ( nếu %% ~ Za equ 0 del "%% ~ a" )

@echo off setlocal EnableDelayedExpansion 0.123.cho/f "mã thông báo = * delims =" %% a in ('dir/s/b/a-d') làm ( nếu %% ~ Za equ 0 del %% ~ sa )

Các vấn đề liên quan