lựa chọn thay thế cho rm -f


10

Tôi muốn chạy một dòng lệnh:

cd ~/www/tmp/; rm -P 2*

Nhưng tôi gặp lỗi nếu không có tệp nào bắt đầu bằng 2.

Bạn sẽ nghĩ rằng tôi muốn sử dụng -f, tuy nhiên:

-f      Attempt to remove the files without prompting for confirmation, regardless of the file's permissions.  If the file does not exist, do not display a diagnostic message or modify the exit status to reflect an error.

Và tôi làm chăm sóc về tập tin permissions- nếu có điều gì đó kỳ lạ đang xảy ra, tôi muốn các lệnh hủy bỏ. Tôi chỉ muốn loại bỏ lỗi 'không tồn tại'.

Tôi đã xem xét một số câu hỏi khác với 'lỗi rm' và thấy hai câu hỏi này có vẻ liên quan:

Xóa các tập tin và thư mục bằng tên của họ. Không có tập tin hoặc thư mục

Nhưng, tôi không hiểu mọi thứ đang diễn ra trong câu trả lời cho câu hỏi này và không biết rằng tôi cần nó?

Bản touchhack được đề xuất trong câu hỏi này:

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

Có vẻ khả thi, vì tôi không nghĩ rằng tôi quan tâm đến hiệu suất (nhưng bạn sẽ thực hiện loại hiệu suất nào? - tức là: đây có phải là một kỹ thuật có thể mở rộng hợp lý không, hay tôi chỉ đang học những thói quen rất xấu?)

Tôi không chắc chắn làm thế nào tôi làm một if-thentrong dòng lệnh.

Có bất kỳ tùy chọn nào khác cho việc dọn dẹp dòng lệnh cut-n-paste đơn giản không?

Sẽ find -deletelàm việc tốt hơn cho trường hợp của tôi? Nếu vậy, tại sao?


lỗi trong câu hỏi:

rm: 2*: No such file or directory

1
Lỗi là từ vỏ của bạn, không phải rm, vì vậy bạn sẽ cần phải nói đó là gì.
Michael Homer

Bạn đang sử dụng zshnhư vỏ tương tác của bạn? Bạn đang nhận được một No matches foundlỗi?
Kusalananda

2
@MichaelHomer Không, lỗi là từ rm. Shell chỉ truyền vào chuỗi 2*thành rm thay vì mở rộng nó thành một danh sách các tệp. Nhìn vào lỗi trong câu hỏi: nó nói rằng rm đang phàn nàn, không phải sh / bas / zsh / ...
doneal24

Câu trả lời:


13

Để chỉ gọi rm -Pcho các tệp thông thường hiện có có tên khớp với mẫu trong thư mục (nhưng không phải bên dưới):

find directory -maxdepth 1 -type f -name 'pattern' -exec rm -P {} +

Ví dụ,

find ~/www/tmp/ -maxdepth 1 -type f -name '2*' -exec rm -P {} +

Để chỉ khớp với các thư mục không phải là thư mục, hãy sử dụng ! -type dthay cho -type f. Sự khác biệt là điều đó ! -type dsẽ đúng với phạm vi rộng hơn của các loại tệp (liên kết tượng trưng, ​​đường ống có tên, ổ cắm, v.v.)

Vì bạn muốn được nhắc về một số điều kiện trên các tệp được tìm thấy, bạn không nên sử dụng -deletethay -exec rmvì điều đó hoạt động như rm -f.

Xóa -maxdepth 1để findxem xét trong thư mục con đệ quy.


3
Mặc dù ! -type dcó thể gần hơn rm 2*, tôi nghĩ?
muru

Vì vậy, tôi phải thêm -P để có được chức năng đó?:find ~/www/tmp/ -maxdepth 1 -type f -name '2*' -exec rm -P {} +
user3082

@ user3082 Có, tôi quên rằng bạn cũng muốn sử dụng -P.
Kusalananda

Cảm ơn @muru, tôi thực sự muốn -type f, nhưng không biết làm thế nào để rmhành động như vậy - vì vậy đề xuất của @ Kusalanada là ngay lập tức, và sự khác biệt / giải thích là tuyệt vời cho việc học.
dùng3082

@ user3082 có lẽ bạn phải sử dụng tính năng mở rộng toàn cầu của mình (ví dụ: rm 2*(.)trong zsh).
muru
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.