2012-05-09 34 views
72

Tôi có danh sách các tập tin bên trong máy chủ Linux:Làm thế nào để xóa nhiều tập tin cùng một lúc trong Bash trên Linux?

abc.log.2012-03-14 
abc.log.2012-03-27 
abc.log.2012-03-28 
abc.log.2012-03-29 
abc.log.2012-03-30 
abc.log.2012-04-02 
abc.log.2012-04-04 
abc.log.2012-04-05 
abc.log.2012-04-09 
abc.log.2012-04-10 

Tôi đã xóa các tập tin log chọn từng người một, bằng cách sử dụng lệnh rm -rf xem dưới đây:

rm -rf abc.log.2012-03-14 
rm -rf abc.log.2012-03-27 
rm -rf abc.log.2012-03-28 

Có một cách khác, để tôi có thể xóa các tệp đã chọn cùng một lúc?

+4

Và "Nói GNU/Linux, không chỉ Linux", tôi nghe thấy tiếng sột soạt từ ghế sau. –

+8

Nhân tiện, tại sao tthe -rf? Các thư mục này có phải không? f là lực, r là đệ qui. Nó sẽ hoạt động nếu nó chỉ là một tập tin nhưng được cảnh báo, sử dụng -rf mỗi khi bạn muốn xóa một cái gì đó rất (rất) (rất rất) nguy hiểm. (và bạn nên thêm thẻ "bash" vì "linux" quá rộng. – Depado

+0

@BorisStitnicky - Tôi tò mò muốn biết tại sao 'GNU' là cần thiết? – user66001

Trả lời

115

Bash hỗ trợ tất cả các loại ký tự đại diện và mở rộng.

trường hợp chính xác của bạn sẽ được xử lý bởi brace expansion, như vậy:

$ rm -rf abc.log.2012-03-{14,27,28} 

Trên đây sẽ mở rộng để một lệnh duy nhất với cả ba đối số, và tương đương với gõ:

$ rm -rf abc.log.2012-03-14 abc.log.2012-03-27 abc.log.2012-03-28 

Điều quan trọng cần lưu ý là việc mở rộng này được thực hiện bởi trình bao, trước khi rm thậm chí được tải.

54

Sử dụng ký tự đại diện (*) để khớp với nhiều tệp.

Ví dụ: lệnh bên dưới sẽ xóa tất cả các tệp có tên bắt đầu bằng abc.log.2012-03-.

rm -f abc.log.2012-03-* 

tôi khuyên bạn nên chạy ls abc.log.2012-03-* để liệt kê các tập tin để bạn có thể xem những gì bạn đang đi để xóa trước khi chạy lệnh rm.

Để biết thêm chi tiết, hãy xem trang người đàn ông Bash trên filename expansion.

+0

Rất hữu ích, nhưng nó không yêu cầu xác nhận xóa. Xin hãy lưu ý. – nuriselcuk

1

Tôi không phải là chuyên gia về Linux, nhưng tôi tin rằng bạn muốn đưa danh sách các tệp xuất ra của mình thành xargs rm -rf. Tôi đã sử dụng một cái gì đó như thế này trong quá khứ với kết quả tốt. Kiểm tra trên một thư mục mẫu đầu tiên!

EDIT - Tôi có thể đã hiểu lầm, dựa trên các câu trả lời khác đang xuất hiện. Nếu bạn có thể sử dụng ký tự đại diện, tuyệt vời. Tôi giả định rằng danh sách ban đầu của bạn mà bạn hiển thị được tạo ra bởi một chương trình để cung cấp cho bạn "lựa chọn" của bạn, vì vậy tôi nghĩ đường ống đến xargs sẽ là con đường để đi.

5

Một thẻ hoang dã sẽ làm việc độc đáo cho điều này, mặc dù được an toàn nó sẽ là tốt nhất để làm cho việc sử dụng các thẻ hoang dã càng ít càng tốt, vì vậy cái gì đó dọc theo dòng này:

rm -rf abc.log.2012-* 

Mặc dù từ vẻ ngoài của nó, đó là những tập tin duy nhất? Tùy chọn đệ quy không cần thiết nếu không có mục nào trong số đó là các thư mục, vì vậy tốt nhất không nên sử dụng nó, chỉ để an toàn.

30

Nếu bạn muốn xóa tất cả các tệp có tên khớp với một biểu mẫu cụ thể, một ký tự đại diện (mẫu hình cầu) là giải pháp đơn giản nhất. Một số ví dụ:

$ rm -f abc.log.*    # Remove them all 
$ rm -f abc.log.2012*   # Remove all logs from 2012 
$ rm -f abc.log.2012-0[123]* # Remove all files from the first quarter of 2012 

Cụm từ thông dụng mạnh hơn ký tự đại diện; bạn có thể cho đầu ra của grep đến rm -f.Ví dụ, nếu một số tên tập tin bắt đầu với "abc.log" và một số với "ABC.log", grep cho phép bạn làm một trận đấu case-insensitive:

$ rm -f $(ls | grep -i '^abc\.log\.') 

Khi tôi làm điều này, tôi chạy lệnh ls | grep ... đầu tiên và kiểm tra xem nó tạo ra đầu ra tôi muốn - đặc biệt nếu tôi đang sử dụng rm -f:

$ ls | grep -i '^abc\.log\.' 
(check that the list is correct) 
$ rm -f $(!!) 

nơi !! mở rộng để các lệnh trước đó. Hoặc tôi có thể nhập mũi tên lên hoặc Ctrl-P và chỉnh sửa dòng trước để thêm lệnh rm -f.

Giả sử bạn đang sử dụng bash shell. Một số shell khác, đặc biệt là csh và tcsh và một số shell có gốc sh cũ hơn, có thể không hỗ trợ cú pháp $(...). Bạn có thể sử dụng cú pháp backtick tương đương:

$ rm -f `ls | grep -i '^abc\.log\.'` 

Các $(...) cú pháp là dễ dàng hơn để đọc, và nếu bạn thực sự đầy tham vọng nó có thể được lồng vào nhau.

Cuối cùng, nếu các tập hợp con của các tập tin bạn muốn xóa không thể dễ dàng bày tỏ với một biểu thức chính quy, một thủ thuật tôi thường sử dụng là lập danh sách các tập tin vào một tập tin văn bản tạm thời, sau đó chỉnh sửa nó:

$ ls > list 
$ vi list # Use your favorite text editor 

sau đó tôi có thể chỉnh sửa các tập tin list bằng tay, chỉ để lại các tập tin tôi muốn loại bỏ, và sau đó:

$ rm -f $(<list) 

hoặc

$ rm -f `cat list` 

(Điều này giả định không ai trong số các tên tập tin chứa các ký tự hài hước, đặc biệt là không gian.)

Hoặc, khi chỉnh sửa các tập tin list, tôi có thể thêm rm -f đến đầu của mỗi dòng và sau đó:

$ . ./list 

hoặc

$ source ./list 
-1

nếu bạn muốn xóa tất cả các tệp thuộc về một thư mục cùng một lúc. Ví dụ; yor Tên thư mục là "đăng nhập" và "đăng nhập" thư mục bao gồm abc.log.2012-03-14, abc.log.2012-03-15, ..... ect tệp. Bạn phải trên thư mục log và

rm -rf/log/*

4

Chỉ cần sử dụng lựa chọn nhiều dòng trong siêu việt để kết hợp tất cả các tập tin vào một dòng duy nhất và thêm dấu cách giữa mỗi tên tập tin và sau đó thêm rm vào đầu danh sách. Điều này chủ yếu hữu ích khi không có mẫu trong tên tệp bạn muốn xóa.

[$]> rm abc.log.2012-03-14 abc.log.2012-03-27 abc.log.2012-03-28 abc.log.2012-03-29 abc.log.2012-03-30 abc.log.2012-04-02 abc.log.2012-04-04 abc.log.2012-04-05 abc.log.2012-04-09 abc.log.2012-04-10 
+0

Đây phải là câu trả lời được chấp nhận vì nó trả lời rõ ràng câu hỏi đặt ra. Nó thân thiện hơn với những người đến từ Google. – Alex

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