Lời khuyên dành cho @ gniourf_gniourf để xóa bỏ một quan niệm sai lầm cơ bản.
Câu trả lời này cố gắng cung cấp một cái nhìn tổng quan về các câu trả lời hiện có và thảo luận về sự tinh tế và giá trị tương đối của chúng cũng như cung cấp thông tin cơ bản , đặc biệt là về tính khả chuyển .
Việc tìm kiếm các tệp có thể thực thi có thể đề cập đến hai trường hợp sử dụng riêng biệt :
- lấy người dùng làm trung tâm : tìm các tệp được người dùng hiện tại thực thi .
- trung tâm tệp : tìm tệp có (một hoặc nhiều) bit quyền thực thi được thiết lập .
Lưu ý rằng trong cả hai trường hợp, có thể hợp lý khi sử dụngfind -L ...
thay vì chỉ find ...
để tìm các liên kết tượng trưng cho các tệp thực thi .
Lưu ý rằng trường hợp đơn giản nhất tập trung vào tệp - tìm kiếm tệp thực thi với bit quyền thực thi được đặt cho TẤT CẢ ba nguyên tắc bảo mật (người dùng, nhóm, người khác) - thường sẽ , nhưng không nhất thiết phải mang lại kết quả giống như trường hợp lấy người dùng làm trung tâm - và nó quan trọng để hiểu sự khác biệt.
Lấy người dùng làm trung tâm ( -executable
)
Các câu trả lời được chấp nhận commendably khuyến cáo -executable
, NẾU GNU find
có sẵn.
- GNU
find
đi kèm với hầu hết các bản phân phối Linux
- Ngược lại, các nền tảng dựa trên BSD, bao gồm cả macOS, đi kèm với BSD find, tính năng này kém mạnh mẽ hơn.
- Theo yêu cầu của kịch bản,
-executable
chỉ khớp các tệp mà người dùng hiện tại có thể thực thi (có các trường hợp cạnh. [1] ).
Giải pháp thay thế BSD find
được cung cấp bởi câu trả lời được chấp nhận ( -perm +111
) trả lời một câu hỏi khác , trọng tâm là tệp (như chính câu trả lời đã nêu).
- Sử dụng chỉ
-perm
để trả lời câu dùng câu hỏi -centric là không thể , bởi vì những gì cần thiết là để liên hệ các của tập tin người dùng và nhóm sắc cho người dùng hiện tại của , trong khi đó -perm
chỉ có thể kiểm tra của tập tin cho phép.
Chỉ sử dụng các find
tính năng của POSIX , không thể trả lời câu hỏi mà không liên quan đến các tiện ích bên ngoài.
Do đó, tốt nhất -perm
có thể làm được (bởi chính nó) là một xấp xỉ của -executable
. Có lẽ một ước tính gần đúng hơn -perm +111
là-perm -111
, để tìm các tệp có bit thực thi được đặt cho TẤT CẢ các nguyên tắc bảo mật (người dùng, nhóm, người khác) - điều này đánh giá tôi là trường hợp điển hình trong thế giới thực. Như một phần thưởng, nó cũng tuân thủ POSIX (sử dụng find -L
để bao gồm các liên kết tượng trưng, xem thêm bên dưới để giải thích):
find . -type f -perm -111 # or: find . -type f -perm -a=x
Câu trả lời của gniourf_gniourf cung cấp một câu trả lời đúng, có thể di động được-executable
, sử dụng-exec test -x {} \;
, mặc dù phải trả giá bằng hiệu suất .
Việc kết hợp -exec test -x {} \;
với -perm +111
(tức là, các tệp có ít nhất một bộ bit thực thi) có thể giúp hiệu suất trong đó exec
không cần được gọi cho mọi tệp (phần sau sử dụng tương đương với BSD find -perm +111
/ GNU tuân theo POSIX -perm /111
; xem thêm bên dưới để giải thích) :
find . -type f \( -perm -u=x -o -perm -g=x -o -perm -o=x \) -exec test -x {} \; -print
Trung tâm tệp ( -perm
)
- Để trả lời tập tin câu hỏi -centric , nó là đủ để sử dụng POSIX-compliant
-perm
chính (được gọi là một thử nghiệm trong thuật ngữ tìm GNU).
-perm
cho phép bạn kiểm tra mọi quyền đối với tệp, không chỉ khả năng thực thi.
- Quyền được chỉ định dưới dạng chế độ bát phân hoặc ký hiệu . Chế độ bát phân là số bát phân (ví dụ, ), trong khi chế độ tượng trưng là chuỗi (ví dụ, ).
111
a=x
- Các chế độ tượng trưng xác định các nguyên tắc bảo mật là
u
(người dùng), g
(nhóm) và o
(khác), hoặc a
để chỉ cả ba. x
Ví dụ, quyền được thể hiện như đối với quyền thực thi và được chỉ định cho các hiệu trưởng sử dụng toán tử =
, +
và -
; để có một cuộc thảo luận đầy đủ, bao gồm cả các chế độ bát phân, hãy xem thông số kỹ thuật của chmod
tiện ích POSIX .
- Trong bối cảnh
find
:
- Tiền tố một chế độ với
-
(ví dụ -ug=x
:) có nghĩa là: khớp các tệp có tất cả các quyền được chỉ định (nhưng các tệp phù hợp có thể có thêm quyền).
- Không có tiền tố KHÔNG (ví dụ
755
:) có nghĩa là: khớp các tệp có bộ quyền chính xác, đầy đủ này .
- Lưu ý : Cả GNU find và BSD find đều triển khai tiền tố bổ sung, không chuẩn với logic BẤT KỲ-of-the-allow-bits-set logic , nhưng làm như vậy với cú pháp không tương thích :
- BSD tìm:
+
- GNU tìm thấy:
/
[2]
- Do đó, hãy tránh những phần mở rộng này, nếu mã của bạn phải có tính di động .
- Các ví dụ dưới đây minh họa câu trả lời di động cho các câu hỏi tập trung vào tệp khác nhau.
Ví dụ về lệnh tập trung vào tệp
Ghi chú:
- Các ví dụ sau đây tương thích với POSIX , có nghĩa là chúng sẽ hoạt động trong bất kỳ triển khai tương thích với POSIX nào, bao gồm tìm kiếm GNU và tìm kiếm BSD; cụ thể, điều này yêu cầu:
- KHÔNG sử dụng tiền tố chế độ không chuẩn
+
hoặc /
.
- Sử dụng các dạng POSIX của các toán tử logic sơ khai :
!
cho NOT (tìm GNU và tìm BSD cũng cho phép -not
); lưu ý \!
được sử dụng trong các ví dụ để bảo vệ !
khỏi việc mở rộng lịch sử shell
-a
cho AND (tìm GNU và tìm BSD cũng cho phép -and
)
-o
cho OR (GNU find và BSD find cũng cho phép -or
)
- Các ví dụ sử dụng các chế độ tượng trưng , vì chúng dễ đọc và dễ nhớ hơn.
- Với tiền tố chế độ
-
, các toán tử =
và +
có thể được sử dụng thay thế cho nhau (ví dụ: -u=x
tương đương với -u+x
- trừ khi bạn áp dụng -x
sau, nhưng không ích lợi gì khi làm điều đó).
- Sử dụng
,
để tham gia các chế độ từng phần; Logic AND được ngụ ý; ví dụ, -u=x,g=x
có nghĩa là cả người dùng và bit thực thi nhóm phải được đặt.
- Chế độ không thể tự diễn đạt phù hợp với tiêu cực trong ý nghĩa của "trận đấu chỉ khi bit này không được thiết lập"; bạn phải sử dụng một
-perm
biểu thức riêng biệt với NOT chính !
,.
- Lưu ý rằng tìm của bầu cử sơ bộ (ví dụ như
-print
, hoặc -perm
; còn được gọi là hành động và kiểm tra trong GNU find) đều được ngầm tham gia với -a
(logic AND), và điều đó -o
và có thể là dấu ngoặc đơn (thoát ở dạng \(
và \)
cho vỏ) là cần thiết để thực hiện OR logic.
find -L ...
thay vì chỉ find ...
được sử dụng để đối sánh các liên kết tượng trưng với tệp thực thi
-L
hướng dẫn tìm để đánh giá mục tiêu của các liên kết tượng trưng thay vì chính các liên kết tượng trưng; do đó, nếu không -L
, -type f
sẽ hoàn toàn bỏ qua các liên kết tượng trưng.
# Match files that have ALL executable bits set - for ALL 3 security
# principals (u (user), g (group), o (others)) and are therefore executable
# by *anyone*.
# This is the typical case, and applies to executables in _system_ locations
# (e.g., /bin) and user-installed executables in _shared_ locations
# (e.g., /usr/local/bin), for instance.
find -L . -type f -perm -a=x # -a=x is the same as -ugo=x
# The POSIX-compliant equivalent of `-perm +111` from the accepted answer:
# Match files that have ANY executable bit set.
# Note the need to group the permission tests using parentheses.
find -L . -type f \( -perm -u=x -o -perm -g=x -o -perm -o=x \)
# A somewhat contrived example to demonstrate the use of a multi-principial
# mode (comma-separated clauses) and negation:
# Match files that have _both_ the user and group executable bit set, while
# also _not_ having the other executable bit set.
find -L . -type f -perm -u=x,g=x \! -perm -o=x
[1] Mô tả -executable
từ man find
GNU find 4.4.2:
Đối sánh các tệp có thể thực thi và các thư mục có thể tìm kiếm được (theo nghĩa phân giải tên tệp). Điều này có tính đến danh sách kiểm soát truy cập và các quyền khác mà xét nghiệm -perm bỏ qua. Thử nghiệm này sử dụng lệnh gọi hệ thống truy cập (2) và do đó có thể bị đánh lừa bởi các máy chủ NFS thực hiện ánh xạ UID (hoặc root-squashing), vì nhiều hệ thống triển khai quyền truy cập (2) trong hạt nhân của máy khách và do đó không thể sử dụng thông tin ánh xạ UID được lưu giữ trên máy chủ. Bởi vì kiểm tra này chỉ dựa trên kết quả của lệnh gọi hệ thống (2) truy cập, không có gì đảm bảo rằng một tệp mà kiểm tra này thành công có thể thực sự được thực thi.
[2] GNU tìm thấy các phiên bản cũ hơn 4.5.12 cũng cho phép tiền tố +
, nhưng điều này lần đầu tiên không được chấp nhận và cuối cùng bị loại bỏ, bởi vì việc kết hợp +
với các chế độ tượng trưng có thể mang lại kết quả không mong muốn do được hiểu là mặt nạ quyền chính xác . Nếu bạn (a) chạy trên phiên bản trước 4.5.12 và (b) chỉ giới hạn bản thân ở chế độ bát phân , bạn có thể bỏ qua việc sử dụng +
với cả GNU find và BSD find, nhưng đó không phải là một ý kiến hay.