Điểm thực sự của tùy chọn -f trên rm là gì?


14

Bằng cách đọc trang man GNU coreutils rm, một trong các tùy chọn là -f, theo hướng dẫn,

-f, --force
          ignore nonexistent files and arguments, never prompt

Bây giờ, tôi đã thực hiện một số thử nghiệm và cho thấy rằng thực sự nếu tôi sử dụng một cái gì đó như

rm -f /nonexisting/directory/

nó sẽ không phàn nàn.

Ai đó thực sự có thể đạt được từ một lựa chọn như vậy?

Cộng với các ví dụ phổ biến nhất về "xóa thư mục" bằng cách sử dụng rmlà một cái gì đó như

 rm -rf /delete/this/dir

Các -rtùy chọn có ý nghĩa, nhưng -f?

Câu trả lời:


9

Tôi thấy rằng trang người đàn ông thiếu một chút chi tiết trong trường hợp này. Các -ftùy chọn rmthực sự có khá một vài trường hợp sử dụng:

  • Để tránh mã thoát lỗi
  • Để tránh bị nhắc nhở
  • Để bỏ qua kiểm tra quyền

Bạn đúng rằng việc xóa một tệp không tồn tại là vô nghĩa, nhưng trong các tập lệnh, thật tiện lợi khi có thể nói "Tôi không muốn các tệp này, xóa chúng nếu bạn tìm thấy chúng, nhưng đừng làm phiền tôi nếu chúng không làm phiền "T tồn tại". Một số người sử dụng set -etập lệnh của họ để nó dừng lại ở bất kỳ lỗi nào (để tránh bất kỳ thiệt hại nào nữa mà tập lệnh có thể gây ra) và rm -rf /home/my/garbagedễ dàng hơn if [[ -f /home/my/garbage ]]; then rm -r /home/my/garbage; fi.

Một lưu ý về kiểm tra quyền: để xóa một tệp, bạn cần có quyền ghi vào thư mục mẹ , không phải chính tệp đó. Vì vậy, giả sử bằng cách nào đó có một tệp thuộc sở hữu roottrong thư mục nhà của bạn và bạn không có sudoquyền truy cập, bạn vẫn có thể xóa tệp bằng -ftùy chọn. Nếu bạn sử dụng Git, bạn có thể thấy Git không để lại quyền ghi trên các tệp đối tượng mà nó tạo:

-r--r--r-- 1 phunehehe phunehehe 62 Aug 31 15:08 testdir/.git/objects/7e/70e8a2a874283163c63d61900b8ba173e5a83c

Vì vậy, nếu bạn sử dụng rm, cách duy nhất để xóa kho Git mà không sử dụng rootlà sử dụng rm -rf.


4
-fkhông tránh được mã thoát lỗi. Nếu rmcố gắng và không xóa một tệp hiện có, nó sẽ trả về mã lỗi.
Gilles 'SO- ngừng trở nên xấu xa'

Tôi đã hạ cấp câu trả lời này vì "Để tránh mã thoát lỗi" nên được viết là "Để tránh mã thoát lỗi trong trường hợp không có toán hạng tệp hoặc toán hạng tệp không tồn tại". Như câu trả lời này được viết bây giờ, nó là sai.
Harold Fischer

6

Các -f tùy chọn ngăn chặn nhắc nhở xác nhận khi xóa một tập tin chỉ đọc. Nó cũng ngăn chặn lỗi khi một hoặc nhiều tệp được cung cấp không tồn tại.

Các -ftùy chọn rất hữu ích khi bạn biết rằng một số các tập tin bạn xóa chưa read-only, và bạn không muốn được nhắc nhở về điều đó.

Các ftùy chọn cũng rất hữu ích khi bạn muốn loại bỏ một số tập tin trong trường hợp họ tồn tại, và không muốn quan tâm cho dù họ tồn tại hay không. Điều này rất thường được sử dụng trong makefiles , để tạo một lệnh loại bỏ các tệp có thể được tạo lại từ các tệp nguồn. Ví dụ: nếu foo.ocó thể được xây dựng lại từ foo.c, bar.ocó thể được xây dựng lại từ bar.cmyappcó thể được xây dựng lại từ foo.obar.osau đó, mục tiêu makefile

clean:
        rm -f *.o myapp

loại bỏ myapp, foo.obar.o nếu chúng tồn tại và không phàn nàn nếu ai trong số họ không tồn tại.

Bao gồm -ftrong các hướng dẫn để loại bỏ một cây thư mục là không cần thiết trong hầu hết các trường hợp. Nó có thể được biện minh bởi vì nếu bạn chắc chắn muốn xóa cây thư mục đó bất kể cái gì trong đó, thì bạn có thể chỉ định -fđể tránh bị nhắc trong trường hợp một số tệp chỉ đọc. Tuy nhiên, những người nói chạy bộ rm -rfthường chỉ lặp đi lặp lại một câu thần chú để loại bỏ thứ gì đó, bất kể các tùy chọn -r-fcó thực sự cần thiết hay không. Nếu các tùy chọn không cần thiết, chúng không được khuyến khích, vì chúng làm tăng nguy cơ lỗi chính tả trong tranh luận sẽ phá hủy thứ gì đó quan trọng.


3

Việc -ichuyển sangrm

Tôi thường thấy -fđược sử dụng rmkhi rmlệnh được đặt bí danh để nó bao gồm các -icông tắc để tương tác. Công -ftắc chống lại -i.

Thí dụ

Mô phỏng vấn đề với rmbí danh rm -i.

$ alias rm='rm -i'

Tạo một số dữ liệu giả mạo

$ touch afile

Bây giờ hãy thử xóa nó bằng phiên bản bí danh của rm

$ rm afile 
rm: remove regular empty file `afile'?

Bây giờ hãy thử sử dụng -f

$ rm -f afile 
$

Quyền

Ngoài ra tôi tin rằng có những trường hợp bạn có quyền truy cập chỉ đọc vào một thư mục và khi bạn cố xóa các tệp và thư mục con trong thư mục đã nói, bạn sẽ bị thách thức với một dấu nhắc tương tự "bạn có chắc không?". Việc sử dụng -fđược thoát khỏi việc phải nói có.


Bằng cách sử dụng bí danh, nó thực sự có ý nghĩa. Và câu trả lời của bạn phù hợp với những gì tôi chỉ hiển thị trong các trang man openbsd. Mặc dù openbsd không phải là GNU / Linux nhưng có vẻ như nó mô tả những gì bạn vừa nói. Đây là liên kết nếu ai đó muốn kiểm tra: [link] openbsd.org/cgi-bin/iêu
saliarosaurus

Với bash, bạn luôn có thể thực hiện \rmđể chạy mà không cần răng cưa (\ là một phím tắt để commandxây dựng nó). Tôi thấy cách sử dụng tốt nhất -flà trong kịch bản shell nơi bạn có thứ gì đó như tệp khóa có thể tồn tại hoặc không tồn tại, -fdừng rm: cannot remove 'file': No such file or directorycảnh báo.
Drav Sloan

@DravSloan Vâng, điều đó cũng có ý nghĩa. Cảm ơn bạn đã trả lời cả Drav Sloan và slm
saliarosaurus

Tôi sử dụng rm -fthường xuyên trên cleanmục tiêu trong Makefiles
Alex

-ikhông thực sự -flà những gì về, đó là một trường hợp cạnh.
Gilles 'SO- ngừng trở nên xấu xa'
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.