Có rm không báo cáo khi một tập tin bị mất?


38

Tôi có một tập lệnh bash mà tôi muốn xóa các tập tin từ các thư mục khác nhau. Thường xuyên, họ sẽ không ở đó vì họ không được tạo ra và điều đó tốt. Có cách nào để tập lệnh không báo cáo lỗi đó không, nhưng nếu rm có một số đầu ra khác để báo cáo điều đó?

Thay phiên, có một lệnh tốt hơn để sử dụng để loại bỏ các tập tin sẽ ít ồn ào hơn?

Câu trả lời:


65

Sử dụng -ftùy chọn. Nó sẽ âm thầm bỏ qua các tập tin không tồn tại.

Từ man rm:

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

[Phần "không bao giờ nhắc" có nghĩa là (a) -fghi đè bất kỳ tùy chọn -ihoặc -Itùy chọn nào được chỉ định trước đó và (b) các tệp được bảo vệ ghi sẽ bị xóa mà không cần hỏi.]

Thí dụ

Nếu không -f, rmsẽ phàn nàn về các tệp bị thiếu:

$ rm nonesuch
rm: cannot remove ‘nonesuch’: No such file or directory

Với -f, nó sẽ im lặng:

$ rm -f nonesuch
$

4
Ồ, tôi mới không nhắc xóa, không nhận ra nó cũng bỏ qua không tồn tại. Tôi hoàn toàn bỏ qua điều đó khi nhìn vào người đàn ông. :-) Cảm ơn bạn. Tôi sẽ đánh dấu đây là câu trả lời ngay khi tôi được phép.
flickerfly

9

Nếu yêu cầu của bạn là rmkhông phàn nàn về các tập tin bị mất tích, nhưng mà bạn cũng muốn có bất kỳ khác sản lượng từ rm, đề nghị của tôi sẽ được thử nghiệm đầu tiên cho sự tồn tại của tập tin mục tiêu, và chỉ gọi rm( mà không cần các -fcờ) nếu các tập tin thực sự tồn tại.

# rest of script
# ...
[ -e "$file" ] && rm "$file"
# ...
# rest of script

Gọi rm -fmột tệp, ví dụ, không có quyền ghi người dùng, sẽ xóa tệp cũng không phát ra lời nhắc thông thường cho kịch bản đó.

Trong trường hợp bạn muốn sử dụng cùng một ý tưởng với nhiều tệp, tôi sẽ tạo một định nghĩa hàm, như:

qrm() {
  for f
  do
    [ -e "$f" ] && rm "$f"
  done
}

Sử dụng nó như: qrm file1 file2-does-not-exist *.txt etc here


1
Thật đáng để biết về khả năng rất nhỏ của tình trạng chủng tộc khi tệp bị xóa (hoặc được tạo) giữa thử nghiệm và xóa, nhưng tôi không thể tưởng tượng rằng nó có liên quan trong bất kỳ tình huống điển hình nào mà người ta sẽ sử dụng tập lệnh shell .
David Z

7

Bạn đã nói rằng bạn vẫn muốn xem đầu ra khác từ rmlệnh khi bạn chạy nó, nhưng sử dụng -ftùy chọn sẽ triệt tiêu những đầu ra đó. Bạn sẽ cần phải lọc STDERR cho những gì bạn muốn, một chút khó khăn, cho bạn muốn mọi thứ khác hiển thị.

Bạn sẽ muốn sử dụng một lệnh như thế này:

rm -f filename 3>&1 1>&2 2>&3 3>&- | grep -v 'No such file or directory'

Lệnh giải thích:

  • -f đối số là bắt buộc và không nhắc xác nhận hoặc lỗi
  • 3>&1 1>&2 2>&3 3>&-là để chuyển xung quanh STDOUT và STDERR để lọc (bạn có thể đọc thêm về điều này ở đây nếu muốn
  • | grep -v 'No such file or directory' đang lọc ra tin nhắn bạn không muốn xem

Bây giờ, nếu bạn chỉ muốn chặn hoàn toàn các thông báo lỗi, bạn có thể chạy lệnh sau:

rm filename 2> /dev/null

Lệnh này chuyển hướng STDERR thành / dev / null để bạn không nhìn thấy nó khi bạn chạy lệnh.


1
(AFAICS) rmmà không -vbao giờ kết quả đầu ra để stdout, stderr chỉ, vì vậy trong trường hợp này bạn chỉ có thể 2>&1 | grepmà không có sự nhảy đó là hữu ích tổng quát hơn,
dave_thompson_085

4

Để thay thế, bạn có thể sử dụng findlệnh với -deletetùy chọn. Điều này sẽ (rõ ràng) chỉ xóa các tệp mà nó tìm thấy để nó không bao giờ cảnh báo nếu không có. Một ví dụ có thể là:

find /var/log/triffids/ -name "*.log" -mtime 30 -delete

sẽ tìm kiếm /var/log/triffids/thư mục và xóa tất cả các tệp có .loghậu tố chưa được sửa đổi trong hơn 30 ngày.

Nó luôn luôn là một ý tưởng tốt để chạy các lệnh này mà không cần sự -deletelựa chọn đầu tiên, để đảm bảo nó tìm các tập tin mà bạn mong đợi.


Tôi thích tùy chọn này và sẽ xem xét một sự thay đổi. Cảm ơn đã chia sẻ nó.
flickerfly

3

Kiểm tra tùy chọn --force( -f) của rm:

-f, - lực lượng

bỏ qua các tệp và đối số không tồn tại, không bao giờ nhắc


2

Đây là một hack, nhưng bạn luôn touchcó thể xóa tệp. Nếu nó không tồn tại, nó sẽ được tạo để rmcó thể loại bỏ nó.


Tôi thích điều này, ngoại trừ hiệu suất - việc chạm vào một số tệp K tốn kém như thế nào thay vì chỉ xóa những tệp không tồn tại?
Dani_l

0

Bạn có thể sử dụng -fnhư nó sẽ, theo trang người đàn ông:

Cố gắng xóa các tệp mà không nhắc xác nhận, bất kể quyền của tệp. Nếu tệp không tồn tại, không hiển thị thông báo chẩn đoán hoặc sửa đổi trạng thái thoát để phản ánh lỗi. cũng nhớ Tùy chọn -f ghi đè mọi tùy chọn -i trước đó.

rm -f xyz-directory

sẽ không nhắc bạn bất cứ điều gì, và sẽ làm chính xác những gì bạn muốn.


-1

Có hai cách chính: Nếu bạn thêm tùy chọn -f, nó sẽ không hiển thị lỗi "không tồn tại" và hai: (hoạt động với hầu hết mọi lệnh) thay vì chỉ thực hiện "thecommand" do "thecommand 2> / dev / null "trong đó" thecommand "là lệnh bạn đang thực hiện.


1
Tôi đã tránh đường ống vì tôi không muốn mất các lỗi khác có thể xảy ra. Tôi không biết họ sẽ như thế nào.
flickerfly
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.