ค้นหาไฟล์ปฏิบัติการทั้งหมดภายในโฟลเดอร์ในเทอร์มินัล


15

ฉันมีโฟลเดอร์myfolderที่มีลำดับชั้นมากของไฟล์ / โฟลเดอร์
วิธีค้นหาไฟล์ที่ปฏิบัติการได้ทั้งหมดในโฟลเดอร์นี้?

บน Ubuntu งานนี้: find . -executable -type f

แต่ Mac OS X Mavericks (ซึ่งใช้ด้วยbash) ล้มเหลวในการรับ:

find: -executable: unknown primary or operator

คำตอบ:


23

นี่จะค้นหาไฟล์ทั้งหมด (ไม่ใช่ symlink) พร้อมชุดบิตที่เรียกใช้งานได้:

find . -perm +111 -type f

นี้จะยังพบ symlinks (ซึ่งมักจะมีความสำคัญเท่าเทียมกัน)

find . -perm +111 -type f -or -type l

นี่เป็นวิธีที่คำสั่งทำงานหากไม่ชัดเจน:

  • find เห็นได้ชัดว่าเป็นโปรแกรมค้นหา (:
  • .อ้างถึงไดเรกทอรีเพื่อเริ่มการค้นหาใน ( .= ไดเรกทอรีปัจจุบัน)
  • -perm +111= ด้วยชุดบิตที่สามารถเรียกใช้งานได้ใด ๆ ( +หมายถึง "บิตใด ๆ เหล่านี้" 111คือเลขฐานแปดสำหรับบิตที่สามารถเรียกใช้งานได้กับเจ้าของกลุ่มและใครก็ได้)
  • -type fหมายถึงประเภทเป็นไฟล์
  • -or บูลีนหรือ
  • -type lหมายถึงประเภทที่เป็นลิงค์สัญลักษณ์

2
คุณสามารถใช้-Lแทน-or -type lการทำให้เกิดการstatโทรใด ๆfindเพื่อคืนค่าสถิติของไฟล์ที่ลิงก์ไปไม่ใช่การเชื่อมโยงเอง
เอียนซี

ปัญหาที่ฉันพบด้วยวิธีนี้คือไฟล์ใด ๆ ที่สามารถมีสิทธิ์เรียกใช้ ตัวอย่างเช่นหลังจากที่คุณดาวน์โหลดไฟล์ข้อความบางส่วนจาก Windows การอนุญาตจะยุ่งเหยิง
Ivan Z. Xiao

4

ฉันไม่สามารถตอบคำถามของเอียนได้ (10.6.8) แต่สิ่งต่อไปนี้ให้ผลลัพธ์ที่คาดหวัง:

find . -type f -perm +0111 -print

แก้ไขการปรับปรุง

ดูเหมือนว่าจะทำงานเช่นกัน!

find . -type f -perm +ugo+x -print

ฉันเดาว่า "x" ไม่มีความหมายหากไม่มีผู้ใช้ / กลุ่ม / ตัวระบุอื่น ๆ


สัญลักษณ์สัญลักษณ์จะต้องใหม่ - ขอบคุณสำหรับการชี้ให้เห็นว่า ฉันอัปเดตคำตอบของฉันดังนั้นจึงใช้เลขฐานแปดและย้อนกลับเข้ากันได้กับ OS X เวอร์ชั่นเก่ากว่า
เอียนซี

ผิดปกติพอสมควรส่วนของ 10.6 manpage นั้นเหมือนกับสิ่งที่คุณยกมา .... ซึ่งเพียงพอที่จะทำให้ฉันขุดลึกลงไปอีกเล็กน้อยและดูว่าเกิดอะไรขึ้น แก้ไขคำตอบของฉันด้านบน
Kent

2
สรุป: ไวยากรณ์คำสั่ง BDS มีความแปลก
เอียนซี

3

จากหน้า man สำหรับ find ใน OS X :

 -perm [-|+]mode
         The mode may be either symbolic (see chmod(1)) or an octal number.  If the mode is symbolic, a
         starting value of zero is assumed and the mode sets or clears permissions without regard to the
         process' file mode creation mask.  If the mode is octal, only bits 07777 (S_ISUID | S_ISGID |
         S_ISTXT | S_IRWXU | S_IRWXG | S_IRWXO) of the file's mode bits participate in the comparison.
         If the mode is preceded by a dash (``-''), this primary evaluates to true if at least all of
         the bits in the mode are set in the file's mode bits.  If the mode is preceded by a plus
         (``+''), this primary evaluates to true if any of the bits in the mode are set in the file's
         mode bits.  Otherwise, this primary evaluates to true if the bits in the mode exactly match the
         file's mode bits.  Note, the first character of a symbolic mode may not be a dash (``-'').

ดังนั้นคุณต้อง:

find . -type f -perm +0111 -print

โปรดจำไว้ว่า OS X เป็นแบบBSDไม่ใช่ Linux ดังนั้นคำสั่ง Gnu ที่คุณคุ้นเคยในการกระจาย Linux (ซึ่งfindเป็นหนึ่งในนั้น) ไม่จำเป็นต้องเหมือนกับใน OS X นี่ไม่ใช่ ความแตกต่างของเชลล์มันเป็นความแตกต่างของเครื่องมืออรรถประโยชน์ระบบปฏิบัติการและระบบปฏิบัติการ


1

เป็นคำถามที่เก่ามากฉันรู้ แต่ค้นหาวิธีแก้ปัญหาที่ฉันอาจพบคำตอบที่ดีกว่า

ปัญหาหลักของการใช้ "find" คือมันขึ้นอยู่กับชุดของแอ็ตทริบิวต์ที่สามารถเรียกใช้งานได้แม้ว่าแอ็ตทริบิวต์นี้จะถูกตั้งค่าสำหรับไฟล์ที่ไม่สามารถเรียกใช้งานได้

MacOS มาพร้อมกับเครื่องมือบรรทัดคำสั่งเล็ก ๆ " file" ซึ่งจะแสดงข้อมูลไฟล์ตัวอย่างเช่น:

$> file *

Distribution:             directory
SomeFile.icns:            Mac OS X icon, 3272878 bytes, "ic09" type
MyPicture.png:            PNG image data, 1024 x 1024, 8-bit/color RGBA, non-interlaced
NSHelpers.pas:            Algol 68 source text, ASCII text
myProgram:                Mach-O 64-bit executable x86_64

อย่างที่คุณเห็น 'MyProgram' เป็นไฟล์ที่เรียกใช้งานได้และระบุไว้เป็นอย่างดี เนื่องจาก executables 32 บิตแบบเก่าจะมีวลี "executable" ในนี้เช่นกันดังนั้นรายการต่อไปนี้ควรแสดงรายการ executable จริงทั้งหมด (ไบนารี):

file * | grep "executable"

หวังว่านี่จะเป็นประโยชน์กับใครบางคนที่กำลังมองหาคำตอบสำหรับคำถามเดียวกันเช่นกัน

หมายเหตุ: fileดูเหมือนจะไม่มีฟังก์ชั่นในการเรียกคืนผ่านไดเรกทอรีย่อย

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