Làm thế nào để xóa nhiều tệp cùng một lúc trong Bash trên Linux?


103

Tôi có danh sách các tệp này trên máy chủ 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 từng tệp nhật ký đã chọn, sử dụng lệnh rm -rfxem bên dưới:

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

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


4
Và "Nói GNU / Linux, không chỉ Linux", tôi nghe thấy tiếng sấm sét từ hàng ghế sau.
Boris Stitnicky

8
Nhân tiện, tại sao lại -rf? Đây là những thư mục? f là buộc, r là đệ quy. Nó sẽ hoạt động nếu nó chỉ là một tệp nhưng được cảnh báo, việc sử dụng -rf mỗi khi bạn muốn xóa thứ gì đó là rất (rất) (rất) nguy hiểm. (và bạn nên thêm thẻ "bash" vì "linux" quá rộng.
Depado

@BorisStitnicky - Tôi tò mò là tại sao lại GNUcần?
user66001

2
@ user66001: Đối với ý kiến ​​của dự án GNU về vấn đề này: gnu.org/gnu/linux-and-gnu.html . Tôi không có quan điểm gì về vấn đề này, ít nhất là không phải ở đây, và đây không phải là nơi để tranh luận về nó.
Keith Thompson

2
@BorisStitnicky - Không cần phải tranh luận, đã hoàn toàn tránh khỏi thất bại, và liên kết đó đã cho tôi mức độ thông tin tôi đang tìm kiếm 1
user66001

Câu trả lời:


159

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ằng cách mở rộng dấu ngoặc nhọn , như vậy:

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

Ở trên sẽ mở rộng thành một lệnh duy nhất có cả ba đối số và tương đương với việc nhập:

$ 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 shell, trước khi rmđược tải.


Không sử dụng "rm" nếu bạn muốn khôi phục lại các tập tin trong tương lai .Bạn có thể sử dụng "rm-thùng rác" tiện ích: github.com/nateshmbhat/rm-trash
Natesh Bhat

75

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

Ví dụ: lệnh dưới đây 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 để bạn có thể xem những gì bạn sẽ xóa trước khi chạy rmlệnh.

Để biết thêm chi tiết, hãy xem trang Bash man về phần mở rộng tên tệp .


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
@nuriselcuk bạn có thể thêm -i để xác nhận từng tệp bị xóa.
Felipe Romero

Làm việc như một sự quyến rũ trên AWS Ec2-Instance chạy Amazon Linux 1 :) Cảm ơn bạn.
Kyle Bridenstine

41

Nếu bạn muốn xóa tất cả các tệp có tên khớp với một dạng cụ thể, ký tự đại diện (mẫu hình cầu) là giải pháp đơn giản nhất. Vài 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

Biểu thức chính quy mạnh hơn ký tự đại diện; bạn có thể cấp dữ liệu đầu ra grepcho rm -f. Ví dụ: nếu một số tên tệp bắt đầu bằng "abc.log"và một số tên bằng "ABC.log", grepcho phép bạn thực hiện đối sánh không phân biệt chữ hoa chữ thường:

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

Điều này sẽ gây ra vấn đề nếu bất kỳ tên tệp nào chứa các ký tự vui nhộn, bao gồm cả dấu cách. Hãy cẩn thận.

Khi tôi làm điều này, tôi chạy ls | grep ...lệnh trước và kiểm tra xem nó có tạo ra kết quả mà 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 đến lệnh trước đó. Hoặc tôi có thể gõ mũi tên lên hoặc Ctrl-P và chỉnh sửa dòng trước đó để thêm rm -flệnh.

Điều này 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ó nguồn gốc từ 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 tập hợp con của các tệp bạn muốn xóa không thể được thể hiện dễ dàng bằng một biểu thức chính quy, một mẹo mà tôi thường sử dụng là liệt kê các tệp vào một tệp 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 listtệp theo cách thủ công, chỉ để lại các tệp tôi muốn xóa và sau đó:

$ rm -f $(<list)

hoặc là

$ rm -f `cat list`

(Một lần nữa, điều này giả định rằng không có tên tệp nào chứa các ký tự vui nhộn, đặc biệt là dấu cách.)

Hoặc, khi chỉnh sửa listtệp, tôi có thể thêm rm -f vào đầu mỗi dòng và sau đó:

$ . ./list

hoặc là

$ source ./list

Chỉnh sửa tệp cũng là một cơ hội để thêm dấu ngoặc kép khi cần thiết, ví dụ như thay đổi rm -f foo barthành rm -f 'foo bar'.


8

Chỉ cần sử dụng lựa chọn nhiều dòng trong sublime để kết hợp tất cả các tệp thành một dòng duy nhất và thêm khoảng cách giữa mỗi tên tệp, sau đó thêm rmvà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

Đâ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 đây từ Google.
ATLief,

5

Một thẻ đại diện sẽ hoạt động hiệu quả cho việc này, mặc dù để an toàn, tốt nhất là bạn nên sử dụng thẻ đại diện càng ít càng tốt, vì vậy hãy tìm hiểu sơ lược về vấn đề này:

rm -rf abc.log.2012-*

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


2

Tôi không phải là một chuyên gia về linux, nhưng tôi tin rằng bạn muốn chuyển danh sách các tệp đầu ra của mình sang 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. Thử nghiệm trên một thư mục mẫu đầu tiên!

CHỈNH SỬA - Tôi có thể đã hiểu sai, 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 các ký tự đại diện, thật tuyệt. Tôi cho rằng danh sách ban đầu của bạn mà bạn hiển thị được tạo 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ĩ rằng đường ống xargssẽ là cách để đi.


-1

nếu bạn muốn xóa tất cả các tệp thuộc một thư mục cùng một lúc. Ví dụ: tên Thư mục của bạn là "nhật ký" và thư mục "nhật ký" bao gồm các tệp abc.log.2012-03-14, abc.log.2012-03-15, ... vv. Bạn phải ở trên thư mục nhật ký và:

rm -rf /log/*
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.