วิธีค้นหาไบนารีที่ปฏิบัติการได้ทั้งหมดในไดเรกทอรีซ้ำ?


46

ถ้าฉันใช้findคำสั่งเช่นนี้:

find /mydir/mysubdir -executable -type f

ไฟล์ที่สามารถเรียกทำงานได้ทั้งหมดจะแสดงรายการ (ไม่รวมไดเรกทอรี) และรวมถึงไฟล์สคริปต์ที่สามารถใช้งานได้ (เช่น script.sh เป็นต้น) สิ่งที่ฉันต้องการจะทำคือรายการไฟล์ปฏิบัติการไบนารีเท่านั้น


1
โปรดเปลี่ยนหัวเรื่องเพื่อรวมคำว่า 'binary' ซึ่งเป็นกุญแจสำคัญในการตอบคำถามของคุณ
Stefan Lasiewski

คำตอบ:


44

คุณอาจลองใช้fileยูทิลิตีนี้ ตาม manpage:

การทดสอบเวทมนต์ใช้เพื่อตรวจสอบไฟล์ที่มีข้อมูลในรูปแบบคงที่โดยเฉพาะ ตัวอย่างที่ยอมรับได้ของสิ่งนี้คือไฟล์ a.out ที่สามารถเรียกทำงานแบบไบนารี (โปรแกรมที่คอมไพล์) ซึ่งมีการกำหนดรูปแบบและอาจอยู่ในไดเรกทอรี include มาตรฐาน

คุณอาจต้องเล่นกับนิพจน์ปกติ แต่มีลักษณะดังนี้:

$ find -type f -executable -exec file -i '{}' \; | grep 'x-executable; charset=binary'

ไฟล์มีตัวเลือกมากมายดังนั้นคุณอาจต้องการดูข้อมูลเพิ่มเติมในหน้า man ฉันใช้ตัวเลือกแรกที่ฉันพบว่าดูเหมือนว่าจะส่งออกได้อย่างง่ายดายเพื่อ grep เอาท์พุท


15
find -type f -executable -exec sh -c "file -i '{}' | grep -q 'x-executable; charset=binary'" \; -printผมว่าการใช้งาน มันจะให้เฉพาะไฟล์ของคุณเท่านั้น (และสามารถส่งผ่านไปยังคำสั่งถัดไปที่เขาต้องการเรียกใช้)
Gert

serverfault.com/a/584595/211551โซลูชันค้นหาไฟล์ที่ไม่ได้ระบุว่าสามารถเรียกทำงานได้ แต่สามารถเรียกใช้งานได้
user2067125

ใน OS X คุณสามารถติดตั้ง GNU findโดยใช้brew install findutilsหรือsudo port install findutilsจากนั้นคุณสามารถเรียกใช้งานสิ่งนี้เพื่อเอฟเฟกต์ที่คล้ายกัน:gfind . -type f -executable -exec file '{}' \; | grep -i execut
GDP2

7

ต่อไปนี้เป็นวิธียกเว้นสคริปต์เช่นไฟล์ที่มีอักขระสองตัวแรกคือ#!:

find -type f -executable -exec sh -c 'test "$(head -c 2 "$1")" != "#!"' sh {} \; -print

สำหรับไฟล์บางประเภทมันไม่ชัดเจนว่าคุณต้องการให้มันจัดเป็นสคริปต์หรือไบนารีตัวอย่างเช่นไฟล์ bytecode ขึ้นอยู่กับวิธีการตั้งค่าสิ่งเหล่านี้อาจเริ่มต้นด้วยหรือไม่#!ก็ได้ ถ้าสิ่งเหล่านี้สำหรับคุณคุณจะต้องทำให้เชลล์สคริปต์ภายในซับซ้อนขึ้น ตัวอย่างเช่นต่อไปนี้เป็นวิธีที่คุณอาจรวมถึงโปรแกรม ELF และโปรแกรมปฏิบัติการโมโนและ Objective Caml bytecode โปรแกรม แต่ไม่ใช่โปรแกรมประเภทอื่นเช่นเชลล์สคริปต์หรือสคริปต์ perl หรือโปรแกรม JVM bytecode:

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

2

ในกรณีที่คุณพบว่าตัวเองอยู่ในระบบที่มีระดับfindล่าง (ยังคงมีอยู่ขณะที่ฉันเขียนกลุ่มวิทยาศาสตร์ lotta ที่เรียกใช้ RHEL5!) โดยไม่มีสิทธิ์อัปเดต: แทนที่จะเป็น

find /mypath/ -executable -type f

ในคำตอบที่ยอดเยี่ยมคุณสามารถทำได้เช่น

find /mypath/h -type f -perm -u+x

ซึ่งค้นหาบิตสิทธิ์ น่าเสียดายที่ไฟล์ข้างต้นจะค้นหาเฉพาะไฟล์ที่ผู้ใช้สามารถใช้งานได้ แต่มักใช้งานได้สำหรับฉัน


นี่จะยังคงพบสคริปต์ที่เรียกใช้งานได้ไม่ใช่เฉพาะไบนารี
Kusalananda
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.