Tìm kiếm các tệp thực thi bằng lệnh find


113

Tôi có thể sử dụng loại tham số / cờ nào với findlệnh Unix để tìm kiếm các tệp thực thi?


gõ 'man find'. Tôi nghĩ '-executable' là tùy chọn bạn muốn.
sje397

3
find -executable... nhưng điều này không đảm bảo rằng mọi tệp được liệt kê sẽ thực sự thực thi
William

1
Không phải tất cả các triển khai của findđều được tạo ra như nhau. Tùy chọn do @ sje397 và @William đề xuất có thể không khả dụng. Tốt hơn là sử dụng giải pháp được chấp nhận được hiển thị bên dưới.
LS


Tôi không thích tất cả các đề xuất hiển thị bên dưới dựa trên quyền đối với tệp. Lập luận: đối với hệ điều hành GNU của tôi (Ubuntu), có thể đặt cờ "x" (có thể thực thi) cho tệp văn bản ASCII chẳng hạn. Không có sự bắt chước nào ngăn hoạt động này hoàn thành thành công. Nó chỉ cần một lỗi nhỏ / lỗi cho nhiều tệp không có chủ đích để được gán cờ x. Do đó giải pháp gniourf_gniourf 'là yêu thích của cá nhân tôi. Tuy nhiên, có nhược điểm là đối với các tệp thực thi được biên dịch chéo cần có trình giả lập hoặc thiết bị đích.
Na13-c

Câu trả lời:


173

Trên các phiên bản GNU của find, bạn có thể sử dụng -executable:

find . -type f -executable -print

Đối với các phiên bản BSD của tìm kiếm, bạn có thể sử dụng -permvới +và một mặt nạ bát phân:

find . -type f -perm +111 -print

Trong ngữ cảnh này "+" có nghĩa là "bất kỳ bit nào trong số này được đặt" và 111 là các bit thực thi.

Lưu ý rằng điều này không giống với -executablevị từ trong GNU find. Cụ thể, -executablekiểm tra xem tệp có thể được thực thi bởi người dùng hiện tại hay không, trong khi -perm +111chỉ kiểm tra xem có bất kỳ quyền thực thi nào được đặt hay không.

Các phiên bản cũ hơn của GNU find cũng hỗ trợ -perm +111cú pháp, nhưng kể từ ngày 4.5.12 , cú pháp này không còn được hỗ trợ nữa. Thay vào đó, bạn có thể sử dụng -perm /111để có được hành vi này.


Lỗi find: invalid mode ‘+111’trên findutils 4.5.11 4.fc20.
sourcejedi

1
@sourcejedi Cảm ơn. Tôi thực sự chỉ nói về các phiên bản find không phải GNU (cụ thể là BSD) nhưng các phiên bản GNU find cũ hơn cũng thực sự hỗ trợ cú pháp đó. Trong các phiên bản mới hơn, bạn sẽ phải sử dụng /thay thế +. Xem câu trả lời được cập nhật để biết thêm chi tiết.
Laurence Gonsalves,

Thật vậy, tôi đã đọc sai câu trả lời của bạn. Xin lỗi vì đã làm cho nó phức tạp hơn :).
sourcejedi

Nếu liên kết tượng trưng đến file thực thi cũng cần được tìm thấy, bao gồm các -Ltùy chọn: find -L ....
mklement0

Tôi đã mất một lúc để hiểu ý nghĩa của việc "không giống với vị từ -executable" và "chỉ kiểm tra nếu có bất kỳ quyền thực thi nào được đặt": Điều đó có nghĩa là -perm +111có thể mang lại kết quả dương tính giả , tức là các tệp mà người dùng hiện tại thực sự không thể thực thi. Không có cách nào để mô phỏng -executablebằng cách kiểm tra quyền một mình, bởi vì điều cần thiết là liên kết danh tính người dùng và nhóm của tệp với người dùng hiện tại .
mklement0

35

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ế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, -executablechỉ 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 đó -permchỉ có thể kiểm tra của tập tin cho phép.
      Chỉ sử dụng các findtí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 -permcó 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-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 đó execkhô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ó đủ để sử dụng POSIX-compliant -permchính (được gọi là một thử nghiệm trong thuật ngữ tìm GNU).
    • -permcho 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ụ, ).111a=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. xVí 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ử =, +-; để 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 chmodtiệ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
      • -acho AND (tìm GNU và tìm BSD cũng cho phép -and)
      • -ocho 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ử =+có thể được sử dụng thay thế cho nhau (ví dụ: -u=xtương đương với -u+x- trừ khi bạn áp dụng -xsau, 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=xcó nghĩa là cả người dùng 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 -permbiể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 độngkiểm tra trong GNU find) đều được ngầm tham gia với -a(logic AND), và điều đó -ovà có thể là dấu ngoặc đơn (thoát ở dạng \(\)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
    • -Lhướ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 fsẽ 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ả -executabletừ man findGNU 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 (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.


2
Câu trả lời SO toàn diện nhất bao giờ hết? ;)
andynormancx

@andynormancx :) Chà, về số lượng gạch đầu dòng tuyệt đối, tôi có thể đưa ra ứng cử viên này .
mklement0

11

Để có một khả năng khác 1 là tìm các tệp được người dùng hiện tại thực thi:

find . -type f -exec test -x {} \; -print

(rất có thể lệnh kiểm tra ở đây là lệnh được tìm thấy trong PATH /usr/bin/test, không phải lệnh nội trang).


1 Chỉ sử dụng điều này nếu không có -executablecờ của find! điều này khác biệt một cách tinh tế so với -perm +111giải pháp.


2
Điều này hoạt động, nhưng nó khá chậm. Ngoài ra, tùy thuộc vào trình bao, bạn có thể phải bọc hoặc thoát khỏi trình giữ chỗ tên tệp, như '{}'hoặc \{\}.
Ionoclast Brigham

1
@ mklement0 điều này sẽ không tìm thấy các lệnh được thực thi bởi tôi như -executablekhông hoặc giống như lệnh của tôi.
gniourf_gniourf

1
Cảm ơn, @gniourf_gniourf - Tôi thực sự đã có một vài quan niệm sai lầm ở đó. Tôi in lại bình luận khác của bạn ở đây, bởi vì tôi là ít nhất cho bây giờ xóa câu trả lời của tôi (có lẽ để được sống lại, NẾU có điều gì đó cứu vãn): " find . -type f -perm -u=xkhông tương đương với -executable: -executablephù hợp với tất cả các file mà người dùng có thể thực hiện, và những bao gồm g+xnếu tôi ở trong nhóm thích hợp hoặc o+x. Trên thực tế -perm -u=xsẽ tìm thấy rất nhiều tệp mà người dùng không thể thực thi và bỏ lỡ một vài tệp mà người dùng có thể thực thi. "
mklement0

1
@IonoclastBrigham: Mặc dù phải trích dẫn {}là điều cần thiết về mặt giả thuyết (và trích dẫn không ảnh hưởng gì), nhưng trong thực tế, nó không cần thiết trong các shell giống POSIX và csh. Bạn có biết vỏ, nơi nó được được yêu cầu?
mklement0

4
@IonoclastBrigham: Thật thú vị, cảm ơn; vì vậy, trong fish, {}thực sự phải được thoát ra dưới dạng '{}'hoặc \{\}. Lưu ý rằng bash, kshzshcung cấp cùng một loại mở rộng dấu ngoặc nhọn; tuy nhiên, họ in mã thông báo không được trích dẫn {} như hiện tại (và do đó: không cần thoát), bởi vì họ KHÔNG coi đó là biểu thức dấu ngoặc nhọn hợp lệ (họ yêu cầu ít nhất 2 mã thông báo hoặc biểu thức chuỗi số hợp lệ), trong khi fish coi {}là dấu ngoặc nhọn hợp lệ biểu thức dẫn đến chuỗi trống .
mklement0

9

Bạn có thể sử dụng -executablecờ kiểm tra:

-executable
              Matches files which are executable  and  directories  which  are
              searchable  (in  a file name resolution sense).

4
-executable được cho là một tùy chọn không xác định.
thực sự thì

4
Đó có phải là một tiện ích mở rộng GNU Find không? Vì thẻ là Unix, không phải Linux, nên ít nhất một phần mở rộng GNU cần được ghi lại như vậy.
Jonathan Leffler

3
Tùy chọn này không được hỗ trợ bởi lệnh tìm BSD ít nhất là trên OS X. Đây là một phần mở rộng GNU, nhưng có thể được hỗ trợ bởi các phiên bản tìm kiếm khác.
Ionoclast Brigham

FWIW, tôi thấy điều này không phải là trên SLES 10, nhưng trên SLES> = 11 (có một chút đốt cháy bởi nó)
Peter Turner

Lưu ý rằng điều này không thực sự lấy được tất cả các ví dụ. Trong trường hợp của tôi, tôi đã có một tập tin mà tôi sở hữu như -rw-r-xr-x-executablekhông phát hiện
Dezza

2

Điều này làm việc cho tôi và tôi nghĩ đến việc chia sẻ ...

find ./ -type f -name "*" -not -name "*.o" -exec sh -c '
    case "$(head -n 1 "$1")" in
      ?ELF*) exit 0;;
      MZ*) exit 0;;
      #!*/ocamlrun*)exit0;;
    esac
exit 1
' sh {} \; -print

13
Chỉ còn vài nghìn trường hợp nữa, và bạn sẽ phải sáng tạo lại file!
tripleee

@tripleee +1. Tuyệt vời sẽ là phần mở rộng này:find ./ -mime application/x-sharedlib -o -mime application/x-dosexec
Daniel Alder

@Daniel Alder, bạn sử dụng phiên bản tìm kiếm nào? Tôi không tìm thấy tùy chọn -mime trong find (findutils GNU) 4.4.2
AjayKumarBasuthkar

@tripleee +1. sử dụng 'file' & / 'mimetype' là một ý kiến ​​hay hoặc khám phá tìm phiên bản hỗ trợ -mime thì tốt hơn, Ngoài ra, bạn cũng đang băn khoăn liệu 'file' / 'mimetype' có tùy chọn lọc và chỉ hiển thị (các) tệp thực thi hay không.
AjayKumarBasuthkar

2
find . -executable -type f

không thực sự đảm bảo rằng tệp có thể thực thi được, nó sẽ tìm thấy các tệp có tập bit thực thi. Nếu bạn làm

chmod a+x image.jpg

tìm thấy ở trên sẽ nghĩ rằng image.jpg là một tệp thực thi ngay cả khi nó thực sự là một hình ảnh jpeg với bộ bit thực thi.

Tôi thường giải quyết vấn đề này:

find . -type f -executable -exec file {} \; | grep -wE "executable|shared object|ELF|script|a\.out|ASCII text"

Nếu bạn muốn tìm kiếm thực sự in thông tin mái vòm về các tệp thực thi, bạn có thể làm như sau:

find . -type f -executable -printf "%i.%D %s %m %U %G %C@ %p" 2>/dev/null |while read LINE
do
  NAME=$(awk '{print $NF}' <<< $LINE)
  file -b $NAME |grep -qEw "executable|shared object|ELF|script|a\.out|ASCII text" && echo $LINE
done

Trong ví dụ trên, tên đường dẫn đầy đủ của tệp nằm trong trường cuối cùng và phải phản ánh nơi bạn tìm kiếm nó với awk "NAME = $ (awk '{print $ NF}' <<< $ LINE)" nếu tên tệp ở nơi khác chuỗi đầu ra tìm thấy bạn cần thay thế "NF" bằng vị trí số chính xác. Nếu dấu phân cách của bạn không phải là khoảng trắng, bạn cũng cần cho awk biết dấu phân cách của bạn là gì.


1

Thật là nực cười khi điều này không phải là siêu dễ dàng ... hãy để một mình tiếp theo là không thể . Giơ tay lên, tôi chuyển sang Apple / Spotlight ...

mdfind 'kMDItemContentType=public.unix-executable'

Ít nhất nó hoạt động!


Điều tốt để biết về mdfindOSX. Lưu ý rằng lệnh uour báo cáo các tệp thực thi Unix cho toàn bộ hệ thống . mdfind -onlyin . 'kMDItemContentType=public.unix-executable'giới hạn kết quả cho cây con của thư mục hiện tại. Điểm quan tâm nhỏ: giới hạn tìm kiếm chỉ trong một thư mục cụ thể (không có thư mục con) dường như không được hỗ trợ. Các liên kết biểu tượng đến các tệp thực thi dường như không bao giờ được bao gồm. Thật kỳ lạ, khi mdfindđã tìm thấy một tệp có thể thực thi được, sau đó việc xóa bit thực thi sẽ không được chọn.
mklement0

Tôi nghĩ rằng tôi đã tìm thấy lỗi trong cách Spotlight phát hiện / bỏ phát hiện các tệp Unix thực thi; Tôi đã gửi một lỗi với Apple và cũng tại openradar.me/20162683 . Tôi khuyến khích bạn - và bất kỳ ai quan tâm đến chức năng này - để cũng lỗi tại lỗi tại bugreport.apple.com
mklement0

(Xin lỗi vì nhận xét quá vội vàng; hy vọng bây giờ họ đã chính xác) mdfind -onlyin . 'kMDItemContentType=public.unix-executable'hoạt động như find . -type f -perm +111 -printvậy. Có nghĩa là, nó tìm các tệp có bất kỳ tập hợp bit thực thi nào, có thể mang lại kết quả dương tính giả (mặc dù đó có thể không phải là vấn đề trong thực tế) - để thực sự chỉ tìm thấy các tệp có thể thực thi bởi người dùng hiện tại bằng cách sử dụng BSD find, hãy xem câu trả lời của @ gniourf_gniourf. Sử dụng findgiải pháp dựa trên cơ sở có lợi thế là bạn cũng có thể tìm thấy các liên kết tượng trưng cho các tệp thực thi, nếu muốn (tùy chọn -L), điều này mdfinddường như không thể làm được.
mklement0

1
@ mklement0 câu trả lời của tôi đã tránh xa các phần tô điểm - để thử và bắt đầu quan điểm về nhà - nhưng có, hầu như bạn sẽ không bao giờ sử dụng biểu mẫu "không trang bị" này. một lựa chọn khác - không chắc liệu nó có xuất hiện hay không - là quả cầu cũ tốt .. ls /Applications/**/*(*)trong zshvỏ
Alex Grey

Cảm ơn vì zshmẹo hữu ích - không biết rằng; (dường như bạn có thể so khớp các tệp thực thi ( *) hoặc liên kết biểu tượng ( @), nhưng không phải cả hai, phải không?). Đối với quan điểm ban đầu của bạn: Hãy để tôi nhắc lại: find . -type f -perm +a=xsẽ làm những gì mdfindlệnh của bạn làm, đồng thời cung cấp sự linh hoạt hơn. Bạn thậm chí có thể định dạng lại nó để tuân thủ POSIX.
mklement0

1

Vâng, câu trả lời dễ dàng sẽ là: "các tệp thực thi của bạn nằm trong các thư mục chứa trong biến PATH của bạn" nhưng điều đó sẽ không thực sự tìm thấy tệp thực thi của bạn và dù sao cũng có thể bỏ lỡ rất nhiều tệp thực thi.

Tôi không biết nhiều về mac nhưng tôi nghĩ "mdfind 'kMDItemContentType = public.unix-executeutable'" có thể bỏ lỡ những thứ như tập lệnh được thông dịch

Nếu bạn có thể tìm thấy các tệp với các bit thực thi được đặt (bất kể chúng có thực sự thực thi được hay không) thì bạn vẫn tốt.

find . -type f -perm +111 -print

trong đó tùy chọn "-executable" được hỗ trợ sẽ thực hiện một bộ lọc tiếp theo xem xét acl và các tạo tác quyền khác nhưng về mặt kỹ thuật không khác nhiều so với "-pemr +111".

Có thể trong tương lai tìm thấy sẽ hỗ trợ "-magic" và cho phép bạn tìm kiếm các tệp có id ma thuật cụ thể một cách rõ ràng ... nhưng sau đó bạn sẽ phải chỉ định để xử lý tốt tất cả các định dạng thực thi ma thuật id.

Tôi không biết về một cách dễ dàng đúng về mặt kỹ thuật trên unix.


1

Vì vậy, nếu bạn thực sự muốn tìm các loại tệp thực thi (ví dụ: tập lệnh, tệp nhị phân ELF, v.v.) không chỉ là tệp có quyền thực thi thì bạn có thể muốn làm điều gì đó giống như thế này (trong đó thư mục hiện tại có thể được thay thế bằng bất kỳ thứ gì thư mục bạn muốn):

 gfind . -type f -exec bash -c '[[ $(file -b "'{}'") == *" executable "* ]] ' \; -print

Hoặc đối với những người bạn không sử dụng macports (người dùng linux) hoặc có cài đặt gnu find khi bạn muốn:

 find . -type f -exec bash -c '[[ $(file -b "'{}'") == *" executable "* ]] ' \; -print

Mặc dù nếu bạn đang sử dụng OS X, nó đi kèm với một tiện ích nhỏ ẩn ở đâu đó được gọi là is_exec, về cơ bản nó sẽ đóng gói thử nghiệm nhỏ đó cho bạn để bạn có thể rút ngắn dòng lệnh nếu tìm thấy. Nhưng cách này linh hoạt hơn vì bạn có thể dễ dàng thay thế kiểm tra == bằng kiểm tra = ~ và sử dụng nó để kiểm tra các thuộc tính phức tạp hơn như tệp văn bản thuần thực thi hoặc bất kỳ thông tin nào khác mà lệnh tệp của bạn trả về.


Các quy tắc chính xác về báo giá ở đây khá rõ ràng vì vậy tôi chỉ kết thúc bằng cách thử và sai nhưng tôi rất muốn nghe lời giải thích đúng.


0

Tôi đã gặp vấn đề tương tự và câu trả lời nằm trong mã nguồn dmenu : tiện ích tốt nhất được tạo cho mục đích đó. Bạn có thể biên dịch các tệp 'stest.c' và 'arg.h' và nó sẽ hoạt động. Có một trang người đàn ông để sử dụng, mà tôi đặt ở đó để thuận tiện:

STEST(1)         General Commands Manual         STEST(1)

NAME
       stest - filter a list of files by properties

SYNOPSIS
       stest  [-abcdefghlpqrsuwx]  [-n  file]  [-o  file]
       [file...]

DESCRIPTION
       stest takes a list of files  and  filters  by  the
       files'  properties,  analogous  to test(1).  Files
       which pass all tests are printed to stdout. If  no
       files are given, stest reads files from stdin.

OPTIONS
       -a     Test hidden files.

       -b     Test that files are block specials.

       -c     Test that files are character specials.

       -d     Test that files are directories.

       -e     Test that files exist.

       -f     Test that files are regular files.

       -g     Test  that  files  have  their set-group-ID
              flag set.

       -h     Test that files are symbolic links.

       -l     Test the contents of a directory  given  as
              an argument.

       -n file
              Test that files are newer than file.

       -o file
              Test that files are older than file.

       -p     Test that files are named pipes.

       -q     No  files are printed, only the exit status
              is returned.

       -r     Test that files are readable.

       -s     Test that files are not empty.

       -u     Test that files have their set-user-ID flag
              set.

       -v     Invert  the  sense  of  tests, only failing
              files pass.

       -w     Test that files are writable.

       -x     Test that files are executable.

EXIT STATUS
       0      At least one file passed all tests.

       1      No files passed all tests.

       2      An error occurred.

SEE ALSO
       dmenu(1), test(1)

                        dmenu-4.6                STEST(1)
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.