Tại sao không tìm thấy / rm -iname '* phpmyadmin' xóa phpMyAdmin-Version-XYZ.zip?


8

Tôi có mã sau đây:

find ./ -iname '*phpmyadmin' -exec rm -rf {} \;

Nó xóa một thư mục được gọi phpmyadmin, nhưng nó không xóa một tệp được gọi làphpMyAdmin-Version-XYZ.zip

Ngay cả khi tôi xóa -rf, nó vẫn sẽ không xóa nó (có thể là do vấn đề thứ hai với -iname không ảnh hưởng đến trường hợp không nhạy cảm).

  1. Có cách nào để xóa bất kỳ inode nào trong một rm (file, dir, softlink) không?
  2. Tại sao thêm -inamekhông có hiệu lực?

Lưu ý: Tôi không tìm thấy đối số "xóa bất kỳ inode" nào man rm.


1
Nếu bạn findủng hộ nó, hãy thử -deletehành động. (Ngoài ra, xem gnu.org/software/findutils/manual/html_node/find_html/... cho thảo luận rộng rãi trong nhiều cách để làm điều này không đúng cách.)
Zwol

Câu trả lời:


31

Vấn đề là bạn đang khớp một tệp kết thúc bằng phpmyadmin( không phân biệt chữ hoa chữ thường ) bằng cách sử dụng mẫu *phpmyadmin. Để nhận bất kỳ tệp nào chứa chuỗi phpmyadmin(không phân biệt chữ hoa chữ thường), hãy sử dụng -iname '*phpmyadmin*':

find ./ -iname '*phpmyadmin*' -exec rm -rf {} \;

Có lẽ nhận được các tập tin phù hợp trước khi loại bỏ sẽ là lành mạnh:

find ./ -iname '*phpmyadmin*'

Để trả lời câu hỏi đầu tiên của bạn, không có tùy chọn nào rmtrong không gian người dùng để xử lý các nút.


1
Khá có thể nên xem xét -depthđể findkhông cố gắng gửi lại vào một thư mục mà nó vừa bị xóa.
roaima

8
Không lấy bất cứ điều gì từ câu trả lời, bao gồm điều này, nhưng chỉ muốn nhấn mạnh rằng lý do lệnh của OP không xóa tệp zip là vì nó không tìm thấy nó, do thiếu dấu vết '* 'trên mẫu.
Gwyn Evans

3
@GwynEvans Điều đó cũng có nghĩa là OP không kiểm tra findtrước khi thêm -exectham số. Rất nguy hiểm.
Tulains Córdova

Có thể đề xuất -exec rm -rf {} +- không có điểm nào đối với hình phạt hiệu suất khi chạy một rmtệp trên mỗi tệp.
Charles Duffy

2
find ./ -iname '*phpmyadmin*' -exec /usr/lib/klibc/bin/nuke {} +

Điều này hoạt động ngay cả khi ai đó tạo một thư mục -phpmyadmin.


Tìm (ít nhất là ở đây) tiền tố tên ./, vì vậy không cần thiết: nó sẽ thực thi rm -rf ./-phpmyadmin, sẽ hoạt động với bất kỳ lành mạnh nào rm. Hãy thử find ./ -iname '*whatever*' -exec echo '{}' ';'kiểm tra
derobert

@derobert: Tôi đã gặp rắc rối trong một vài dịp. Một lần bị cắn hai lần nhát. Có lẽ điều đó chỉ có thể xảy ra nếu đối số cần tìm là một cái gì đó như '-annoyingdirectoryname'.
Joshua

1
Nếu ai đó chạy, hãy nói, find */thay vì find ., điều đó sẽ làm điều đó (nếu một tên thư mục phù hợp bắt đầu bằng dấu gạch ngang). Điều đó nói rằng, tôi muốn có xu hướng đề nghị sử dụng --để xử lý những trường hợp này bằng cách cung cấp một end-of-tùy chọn rõ ràng trước khi các {}cuộc tranh cãi. (Xem số 10 trong hướng dẫn cú pháp tiện ích POSIX ).
Charles Duffy

1
Về một bên - {} +hiệu quả hơn đáng kể so với {} \;, vì nó sẽ chỉ chạy càng nhiều trường hợp lệnh của bạn ( nuketrong trường hợp này) là cần thiết để phù hợp với tất cả các mục được tìm thấy trên dòng lệnh, trái ngược với từng mục một.
Charles Duffy

@CharlesDuffy Nếu họ chạy find */thì sự cố sẽ không xảy ra -exec, thư mục có dấu gạch nối sẽ xuất hiện là một findtùy chọn và nó sẽ phàn nàn.
Barmar
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.