Xóa các tập tin trong thư mục mà không có lỗi nếu nó đã trống


31

Là một phần của tập lệnh triển khai, tôi muốn kết xuất một số nội dung được lưu trong bộ nhớ cache từ thư mục tạm thời của mình. Tôi sử dụng một lệnh như:

rm /tmp/our_cache/*

Tuy nhiên, nếu /tmp/our_cachetrống (khá phổ biến khi đẩy nhiều thay đổi liên tiếp vào máy chủ thử nghiệm của chúng tôi), thì điều này sẽ in thông báo lỗi sau:

rm: cannot remove `/tmp/our_cache/*': No such file or directory

Nó không phải là một vấn đề lớn, nhưng nó hơi xấu và tôi muốn cắt giảm tỷ lệ nhiễu tín hiệu trong đầu ra từ tập lệnh này.

Một cách ngắn gọn trong unix để xóa nội dung của một thư mục mà không nhận được thông báo phàn nàn rằng thư mục đã trống?

Câu trả lời:


48

Vì có lẽ bạn muốn xóa tất cả các tệp mà không cần nhắc, tại sao không sử dụng -fchuyển đổi rmđể bỏ qua các tệp không tồn tại?

rm -f /tmp/our_cache/*

Từ trang nam:

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

Ngoài ra, nếu có thể có bất kỳ thư mục con nào trong đó /tmp/our_cache/và bạn cũng muốn xóa chúng và nội dung của chúng, đừng quên công -rtắc.


3
giải pháp rõ ràng nhất và tôi đã không nghĩ về nó! Tôi cảm thấy như anh chàng đầu tiên trong truyện tranh này xkcd.com/399 ;-)
Huygens

6
find /tmp/our_cache/ -mindepth 1 -delete

Chỉnh sửa 1

đã xóa "-type f

Chỉnh sửa 2

Đã thêm tùy chọn không chuẩn -mindepth 1để ngăn thư mục gốc tìm kiếm bị xóa (sau khi lấy -type fgiới hạn đi).


Chỉ là một lưu ý, tôi cũng sẽ rời khỏi -type fvì có thể có các thư mục tạm thời (mặc dù ví dụ trong câu hỏi không có tài khoản cho họ, vì vậy có lẽ họ không ở đó ...)
Izkata 15/03/13

1
sử dụng -type fsẽ chỉ xóa các tệp thông thường, vì vậy các liên kết tượng trưng chẳng hạn sẽ không bị xóa.
Huygens

@rush Xin lỗi, tôi đã không kiểm tra điều đó nhưng chỉ xem qua các trang hướng dẫn có nội dung "Xóa tệp", không đề cập đến các thư mục. Tôi xóa bình luận của tôi.
Hauke ​​Laging 15/03/13

1
Điều đó loại bỏ /tmp/our_cacheđể bạn cũng có thể làm rm -r /tmp/our_cache. Trong khi bạn đang sử dụng các tùy chọn không chuẩn, bạn có thể sử dụng -mindepth 1. Lưu ý rằng trái với rm /tmp/our_cache/*, nó cũng loại bỏ các thư mục con và nội dung và các tệp ẩn của chúng.
Stéphane Chazelas

2

Bạn có thể chuyển hướng lỗi tiêu chuẩn để /dev/nullnó không in lỗi này

$  rm /tmp/our_cache/* 2>/dev/null

2
Điều này cũng sẽ loại bỏ các lỗi hiển thị nếu, giả sử, một tệp không thể bị xóa vì nó đang được sử dụng? Lỗi duy nhất tôi muốn loại bỏ là lỗi hiển thị nếu thư mục đích trống; có vẻ như nó sẽ có tác dụng phụ không mong muốn.
Đánh dấu Amery

Ngay cả khi bạn cố gắng xóa một số tệp mà một số quy trình đã mở, bạn sẽ không gặp lỗi.
pradeepchhetri

1

Một cách khác (mặc dù hơi quá mức ...):

[ ! -z "$(ls -A /tmp/our_cache/)" ] && rm -rf /tmp/our_cache/*

điều này sử dụng testhoặc [để kiểm tra xem chuỗi được trả về từ việc chạy lstrên thư mục của bạn không trống. Sau đó, nếu và chỉ khi, chuỗi đó KHÔNG trống thì nó sẽ xóa mọi thứ trong thư mục của bạn.

LƯU Ý: rời khỏi toàn cầu lssẽ loại bỏ lỗi không có tệp.


-1

Nếu tập lệnh của bạn sử dụng BASH, bạn có thể thử:

if test "$(ls /tmp/our_cache/)" !=  ""; then rm /tmp/our_cache/*; fi

Làm như vậy vẫn sẽ tạo ra lỗi nếu có sự cố "thực" hoặc nếu tệp được bảo vệ (khi đó bạn sẽ cần công cụ -fsửa đổi rmđể xóa loại tệp này) nhưng sẽ tránh được lỗi khi không có tệp.

Nếu bạn sử dụng shell khác ngoài BASH cho tập lệnh của mình, chẳng hạn như zsh, ksh, bạn có thể thử cú pháp khác này có thể dễ mang theo hơn:

if [[ "$(ls /tmp/our_cache/)" !=  "" ]]; then rm /tmp/our_cache/*; fi
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.