Làm thế nào để ngăn rm báo cáo rằng không tìm thấy tệp?


155

Tôi đang sử dụng rmtrong tập lệnh BASH để xóa nhiều tập tin. Đôi khi các tập tin không có mặt, vì vậy nó báo cáo nhiều lỗi. Tôi không cần tin nhắn này. Tôi đã tìm kiếm trang man cho một lệnh để làm cho rmyên lặng, nhưng tùy chọn duy nhất tôi tìm thấy là -f, từ mô tả, "bỏ qua các tệp không tồn tại, không bao giờ nhắc", dường như là lựa chọn đúng, nhưng tên có vẻ không phù hợp , vì vậy tôi lo ngại nó có thể có những hậu quả không lường trước được.

  • -flựa chọn đúng cách để im lặng rm? Tại sao nó không được gọi là -q?
  • Liệu tùy chọn này có làm gì khác không?

4
bạn không muốn sử dụng -f, nó sẽ xóa tệp bạn đã đánh dấu là chỉ đọc.
pizza

Câu trả lời:


209

Công dụng chính của -fnó là buộc loại bỏ các tệp không thể tự xóa bằng cách sử dụng rm(như một trường hợp đặc biệt, nó "loại bỏ" các tệp không tồn tại, do đó loại bỏ thông báo lỗi).

Bạn cũng có thể chuyển hướng thông báo lỗi bằng cách sử dụng

$ rm file.txt 2> /dev/null

(hoặc tương đương với hệ điều hành của bạn). Bạn có thể kiểm tra giá trị $? ngay lập tức sau khi gọi rmđể xem liệu một tập tin có thực sự bị xóa hay không.


3
--flà hợp lệ cho GNU Coreutils rm, nhưng chỉ vì nó là chữ viết tắt duy nhất cho --force. Các hình thức ngắn -flà rõ ràng hơn và di động hơn.
Keith Thompson

Không chắc tôi thậm chí còn nhận ra điều đó. --fở đây chỉ là một lỗi đánh máy cho -f.
chepner

2
2 trong 2>đó làm gì?
Dan

@Maverick Nó chuyển hướng bất kỳ tin nhắn nào được gửi tới stderr tới / dev / null thay vì gửi chúng đến thiết bị đầu cuối.
Benjamin Nolan

72

Vâng, -flà lựa chọn phù hợp nhất cho việc này.


Một số hệ thống sẽ nhắc bạn khi phòng ngay cả với -f cho đến khi bạn sử dụng dấu gạch chéo ngược.
vimdude

11
@vimdude: Không phải "một số hệ thống"; hành vi đó chỉ ra rằng bạn có hàm shell hoặc bí danh ánh xạ rmtới rm -i.
Keith Thompson

27

-f là cờ chính xác, nhưng đối với toán tử kiểm tra, không phải rm

[ -f "$THEFILE" ] && rm "$THEFILE"

điều này đảm bảo rằng tệp tồn tại và là một tệp thông thường (không phải là thư mục, nút thiết bị, v.v.)


4
Tuy nhiên, điều này có một điều kiện chủng tộc, và không nên được sử dụng trong các kịch bản sản xuất.
tripleee

Tôi tin rằng những gì @tripleee chỉ ra là thử nghiệm "-f" và xóa tệp có thể hoàn thành theo bất kỳ thứ tự nào. Một cách khác để làm điều đó là : if [ -f "$THEFILE" ]; then rm "$THEFILE"; fi, làm cho các bước kiểm tra và loại bỏ tệp rõ ràng tuần tự.
robla

2
@robla mã đó thực hiện cùng một điều chính xác với cú pháp dài dòng hơn ... &&! = & ... Thử nghiệm sẽ luôn xảy ra trước rm nhưng một quy trình riêng biệt có thể về mặt kỹ thuật (mặc dù rất khó) xóa nó trước khi chạy rm (trong khi trình bao mã sau khi kiểm tra đang được giải thích).
Technosaurus

Technosaurus - ooops, bạn đã đúng. Bạn nghĩ câu trả lời hay nhất cho câu hỏi của @ mmlac là gì?
robla

3
Và chỉ cần xác nhận, điều kiện cuộc đua là một cái gì đó có thể loại bỏ các tập tin giữa testrm. Không có cách nào rmcó thể thực hiện trước testđây. Nhìn trước khi bạn nhảy là một lỗi phổ biến trong lập trình đồng thời - bạn không thể tin vào kết quả của "cái nhìn" nữa khi bạn thực sự "nhảy"; giải pháp cho vấn đề đó là sử dụng các hoạt động khóa hoặc nguyên tử. Đó chính xác là lý do tại sao bạn muốn rm -f, đó là một ví dụ về cái sau.
tripleee

13

\rm -f file sẽ không bao giờ báo cáo không tìm thấy.


4
Các -r là không cần thiết và nguy hiểm.
mahemoff

1
Tôi giả sử nhiều tập tin hoặc thư mục. Đọc lại yêu cầu của người dùng và bạn nói đúng, anh ta chỉ yêu cầu các tệp. Vì vậy, đã sửa câu trả lời của tôi
vimdude

Dấu gạch chéo ngược trước khi rm làm gì ?? làm ơn các bạn tôi cần một câu trả lời cho điều đó Trên windows của Cygwin, phiên bản 4.1 không thể xử lý \ rm trong khi 3.75 hoạt động tốt.
Ayman Salah

2
@AymanSalah Dấu gạch chéo ngược trong ngữ cảnh này sẽ thoát khỏi bất kỳ chức năng hoặc bí danh nào thực sự rm(như đã phổ biến trên một số trang web vào đầu những năm 1990 để ngăn người mới bắt đầu xóa nội dung và sau đó gọi sysadmin để lấy lại tệp của họ).
tripleee

Cảm ơn bạn - điều này đã giải quyết vấn đề của tôi .. rõ ràng mã thoát cho phép sử dụng chuỗi &&trong khi không có -f nó bị hỏng khi không tìm thấy tệp.
Igor

5

Theo như rm -f"bất cứ điều gì khác", nó buộc ( loại bỏ tốc -f--force) loại bỏ im lặng trong các tình huống rmnếu không sẽ yêu cầu bạn xác nhận. Ví dụ: khi bạn cố gắng xóa một tệp không thể ghi của bạn khỏi thư mục mà bạn có thể ghi.


-9

Tôi đã có vấn đề tương tự cho cshell. Giải pháp duy nhất tôi có là tạo một tệp giả phù hợp với mẫu trước "rm" trong tập lệnh của tôi.


7
Đó thực sự là giải pháp duy nhất ? Bạn đã thử rm -fhay rm filename >&/dev/nullchưa?
Keith Thompson
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.