কোনও বাইনারি এক্সিকিউটেবলকে ডিরেক্টরিতে পুনরাবৃত্তভাবে কীভাবে খুঁজে পাবেন?


46

যদি আমি findএটির মতো কমান্ড ব্যবহার করি :

find /mydir/mysubdir -executable -type f

সমস্ত এক্সিকিউটেবল ফাইলগুলি তালিকাভুক্ত করা হয় (ডিরেক্টরিগুলি বাদে) এবং এক্সিকিউটেবল স্ক্রিপ্ট ফাইল সহ (যেমন স্ক্রিপ্ট.শ ইত্যাদি)। আমি যা করতে চাই তা হ'ল কেবল বাইনারি এক্সিকিউটেবল ফাইলগুলির তালিকা।


1
আপনার প্রশ্নের উত্তর দেওয়ার মূল বিষয়টি 'বাইনারি' শব্দটি অন্তর্ভুক্ত করার জন্য দয়া করে বিষয়টি পরিবর্তন করুন।
স্টিফান লাসিউইস্কি

উত্তর:


44

আপনি fileইউটিলিটি চেষ্টা করতে পারেন । ম্যানপেজ অনুসারে:

ম্যাজিক টেস্টগুলি নির্দিষ্ট নির্দিষ্ট ফর্ম্যাটের ডেটাযুক্ত ফাইলগুলি পরীক্ষা করতে ব্যবহৃত হয়। এর ক্যানোনিকাল উদাহরণটি হ'ল বাইনারি এক্সিকিউটেবল (সংকলিত প্রোগ্রাম) a.out ফাইল, যার ফর্ম্যাটটি সংজ্ঞায়িত করা হয় এবং সম্ভবত স্ট্যান্ডার্ড ডিরেক্টরিতে অন্তর্ভুক্ত থাকে।

আপনি নিয়মিত প্রকাশের সাথে চারপাশে খেলতে পারেন তবে এর মতো কিছু:

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

ফাইলটিতে প্রচুর বিকল্প রয়েছে, সুতরাং আপনি ম্যান পৃষ্ঠাটি খুব কাছ থেকে দেখতে চাইতে পারেন। আমি পাওয়া প্রথম বিকল্পটি ব্যবহার করেছিলাম যা দেখে মনে হয়েছিল সহজেই গ্রেপ আউটপুট আউটপুট দেয়।


15
আমি বলব find -type f -executable -exec sh -c "file -i '{}' | grep -q 'x-executable; charset=binary'" \; -print। এটি কেবল আপনাকে ফাইল দেবে (এবং এভাবে তিনি চালাতে চান পরবর্তী কমান্ডে যেতে পারে)
গার্ট

serverfault.com/a/584595/211551 সমাধান এমন ফাইলগুলি সন্ধান করে যা কার্যকরযোগ্য হিসাবে চিহ্নিত নয় তবে কার্যকর হয়।
ব্যবহারকারী 2067125

OS X এর, আপনি গনুহ ইনস্টল করতে পারেন 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

কিছু ধরণের ফাইলের ক্ষেত্রে, আপনি এগুলি স্ক্রিপ্ট বা বাইনারি হিসাবে শ্রেণিবদ্ধ করতে চান তা স্পষ্ট নয়, উদাহরণস্বরূপ বাইটকোড ফাইলগুলি। কীভাবে জিনিসগুলি সেট আপ করা হয়েছে তার উপর নির্ভর করে এগুলি শুরু হতে পারে বা নাও হতে পারে #!। যদি এটি আপনার কাছে গুরুত্বপূর্ণ হয় তবে আপনাকে অভ্যন্তরীণ শেল স্ক্রিপ্টটিকে আরও জটিল করে তুলতে হবে। উদাহরণস্বরূপ, আপনি এখানে কীভাবে ELF বাইনারি এবং মনো এক্সিকিউটেবল এবং অবজেক্টিভ ক্যামেল বাইটকোড প্রোগ্রামগুলি অন্তর্ভুক্ত করতে পারেন তবে শেল স্ক্রিপ্টস বা পার্ল স্ক্রিপ্ট বা জেভিএম বাইটকোড প্রোগ্রামের মতো অন্যান্য ধরণের এক্সিকিউটেবল নয়:

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(তবে এখনও আমি লিখছি যেমন, একটি লট্টা বিজ্ঞানের ক্লাস্টারগুলি RHEL5 চালাচ্ছে!) আপডেট করার অধিকার ছাড়াই: পরিবর্তে

find /mypath/ -executable -type f

উপরের দুর্দান্ত উত্তরে আপনি করতে পারেন, যেমন,

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

যা অনুমতি বিট অনুসন্ধান করে। দুর্ভাগ্যক্রমে উপরেরগুলি কেবলমাত্র সেই ফাইলগুলি সন্ধান করে যার জন্য ব্যবহারকারী নির্বাহযোগ্য, তবে এটি সাধারণত আমার জন্য কাজ করে।


এটি এখনও কেবল বাইনারি নয়, এক্সিকিউটেবল স্ক্রিপ্টগুলি সন্ধান করতে পারে।
কুসালানন্দ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.