আমি কীভাবে লিনাক্সের একটি নির্দিষ্ট ডিরেক্টরিতে কেবল সম্পাদনযোগ্য ফাইলগুলি সন্ধান করতে পারি?


156

আমি কীভাবে লিনাক্সের একটি নির্দিষ্ট ডিরেক্টরিতে কেবল সম্পাদনযোগ্য ফাইলগুলি সন্ধান করতে পারি?


এখানে BASH স্ক্রিপ্টের এক ধরনের আমি কী বলব :) হয়, এটি না খারাপ হয় stackoverflow.com/a/20209457/2067125
AjayKumarBasuthkar

স্ট্যান্ডার্ড fileকমান্ড ব্যবহার সম্পর্কে কি ?
ব্রেকথ্রু

4
যে কোনও ম্যাকের জন্য এটি করতে ইচ্ছুক (OS X 10.9.5 তে পরীক্ষা করেছেন): ls -l | egrep '^[^d]..x..x..x.*$' উপরের সমস্তটি এক্সিকিউটেবল (সমস্ত / ব্যবহারকারী এবং গোষ্ঠীর জন্য) বর্তমান ডিরেক্টরিতে তালিকাভুক্ত করবেন। দ্রষ্টব্য : -executableবিকল্পটি কোনও ম্যাকের জন্য কাজ করে না সুতরাং উপরের কাজের পরিমাণটি।
টেকফুবার


1
@ টেকফুবার: প্রশ্নটি দ্ব্যর্থক: এর অর্থ কি এমন ফাইলগুলির মধ্যে রয়েছে যা এক্সিকিউটেবল কোড ধারণ করে, বা এর অর্থ এমন ফাইলগুলি যা কার্যকর করতে পারে? কিন্তু এমনকি যদি আমরা ধরে নিই এক্সিকিউটেবল অনুমতি চেয়েছিল হয় যে (যেমন প্রতিক্রিয়া সংখ্যাগরিষ্ঠ বলে মনে হচ্ছে), প্রশ্ন বলে না বিশ্ব এক্সিকিউটেবল । আপনার সমাধানটি এমন ফাইল (এবং ফিফোস, সকেট, সিমলিংক ইত্যাদি) সন্ধান করবে যা বিশ্ব চালুর অনুমতি পেয়েছে তবে 750 ( -rwxr-x---) নয়, যা এখনও কিছু ব্যবহারকারীর জন্য কার্যকর রয়েছে।
জি-ম্যান

উত্তর:


157

এক্সিকিউটেবল ফাইলগুলির জন্য চেক করা -perm(প্রস্তাবিত নয়) বা -executable(প্রস্তাবিত, এটি ACL অ্যাকাউন্টে নেয় হিসাবে ) দিয়ে করা যেতে পারে । -executableবিকল্পটি ব্যবহার করতে :

find <dir> -executable

আপনি যদি কেবল এক্সিকিউটেবল ফাইল এবং অনুসন্ধানযোগ্য ডিরেক্টরি না খুঁজে পেতে চান তবে এর সাথে একত্রিত করুন -type f:

find <dir> -executable -type f

23
একটি শেবাং এর অর্থ তারা নির্বাহযোগ্য নয়। এটি আমাদের কেবলমাত্র কোন দোভাষী ব্যবহার করতে হবে তা আমাদের জানায়। এবং লিনাক্স সংজ্ঞা দ্বারা "এক্সিকিউটেবল ফাইলগুলি" এক্সিকিউটেবল (এক্স) বিট সেট সহ ফাইলগুলি হয়
নিটল

2
কোন ধরণের সন্ধানটি টাইপটির জন্য এই ধরণের সমর্থন করে? মানুষ আমার সিস্টেমে খ, সি, ডি, পি, এফ, এল, এস এবং ডি তালিকাগুলি খুঁজে পাবে।
innaM

2
এখানেও, আমার সন্ধানের একটিও নেই -type x
ডেভর

7
আপনার যদি সন্ধানের একটি পুরানো সংস্করণ থাকে (সম্ভবত 4.3.8 এর আগে) যা ব্যবহারযোগ্য অনুসন্ধানের অভাব রয়েছে। -স্পার্ম / ইউ = এক্স, জি = এক্স, ও = এক্স
লুডউইগ ওয়েইঞ্জিয়র

8
find: invalid predicate -executable'RHEL
এসএসএইচে এই

33

অনুসন্ধানের -permবিকল্পটি ব্যবহার করুন । এটি বর্তমান ডিরেক্টরিতে ফাইলগুলি আবিষ্কার করবে যা হয় তাদের মালিক, গ্রুপ সদস্য বা অন্যদের দ্বারা কার্যকর করা যায়:

find . -perm /u=x,g=x,o=x

সম্পাদনা:

আমি সবেমাত্র অন্য একটি বিকল্প পেয়েছি যা কমপক্ষে জিএনইউতে উপস্থিত রয়েছে 4.4.0 তে:

find . -executable

এটি আরও ভাল কাজ করা উচিত কারণ এসিএলগুলিও বিবেচিত হয়।


2
এটি কেবল সন্ধানের নতুন সংস্করণে কাজ করে। find: invalid mode সেন্টোসের সাথে ডিফল্টরূপে যেটি আসে সে ত্রুটিটি দেয় / u = x, g = x, o = x'`
davr

12
তারপরে আপনার "-স্পর্ম +" সংস্করণটি চেষ্টা করা উচিত যা এখন GNU ফাইন্ড: সন্ধান করুন-এ অবনতিযুক্ত। -পার্ম +111 "
innaM

মনে হচ্ছে -perm /111এটি সর্বাধিক বহনযোগ্য সংস্করণ।
স্কট

12

আমি জানি যে প্রশ্নটি বিশেষত লিনাক্সের উল্লেখ করেছে, তবে যেহেতু এটি গুগলের প্রথম ফলাফল, আমি কেবল যে উত্তরটি সন্ধান করছিলাম তা যুক্ত করতে চেয়েছিলাম (উদাহরণস্বরূপ যদি আপনি এই মুহুর্তে আমার মতো হন - আপনার নিয়োগকর্তাকে জোর করে জিএনইউ ব্যবহার করতে বাধ্য করেন) / লিনাক্স সিস্টেম)।

ম্যাকোস 10.12.5 এ পরীক্ষিত

find . -perm +111 -type f

1
RHEL 5 এও কাজ করে।
হোসে টমসের টোকিনো

এটিই কেবলমাত্র বৈকল্পিক যা আমি ওএস এক্স 10.14, থেএক্সএক্স
জাস্টিন

3

আমার কাছে অন্য পদ্ধতি রয়েছে, আপনি যা করতে চান তা হ'ল এক্সিকিউটেবল ফাইলের সাথে কিছু করা - এবং অগত্যা নিজেকে ফিল্টার করার জন্য জোর করে বলার দরকার নেই:

for i in `find -type f`; do [ -x $i ] && echo "$i is executable"; done

আমি এটি পছন্দ করি কারণ এটি -executableপ্ল্যাটফর্ম নির্দিষ্ট যা নির্ভর করে না ; এবং এটি নির্ভর করে না -permযা কিছুটা আরকেন, একটি বিট প্ল্যাটফর্ম নির্দিষ্ট, এবং উপরে লিখিতভাবে ফাইলটি প্রত্যেকের জন্য কার্যকর করা দরকার (কেবল আপনি নয়)।

-type fগুরুত্বপূর্ণ কারণ * মধ্যে তুষার ডিরেক্টরি traversable হতে এক্সিকিউটেবল হতে হবে, এবং কোয়েরি আরো রয়েছে findকমান্ড আপনার কমান্ড আরো মেমরি দক্ষ হবে।

যাইহোক, কেবল অন্য পদ্ধতির প্রস্তাব দিচ্ছেন, যেহেতু * নিক্স একটি বিলিয়ন পদ্ধতির দেশ।


(0) আপনি কোনটি পছন্দ করেন, তীরচিহ্ন এবং সঠিক বা স্বজ্ঞাত এবং ত্রুটিযুক্ত? আমি সঠিক পছন্দ। (1)  innaM এর উত্তর , বৈশিষ্ট্যযুক্ত find -perm, এমন ফাইলগুলি খুঁজে পায় যাতে কোনও নির্বাহী অনুমতি বিট সেট রয়েছে। (২) বিপরীতে, এই উত্তরটি কেবলমাত্র এমন ফাইলগুলি খুঁজে পায় যার জন্য বর্তমান ব্যবহারকারীর অনুমতি কার্যকর করেছে। মঞ্জুর, এটি ওপি যা চায় তা হতে পারে তবে এটি অস্পষ্ট। … (চালিয়ে যাওয়া)
স্কট

(চালিয়ে যাওয়া) ... (3) স্বচ্ছতার জন্য আপনি হয়ত এইটিতে পরিবর্তন `…`করতে চান $(…)- এটি , এটি এবং এটি দেখুন । (4) তবে করবেন না for i in $(find …); do …; এটি স্থান (গুলি) ধারণ করে এমন ফাইলের নামগুলিতে ব্যর্থ হয়। পরিবর্তে, না find … -exec …। ()) এবং আপনি যখন শেল ভেরিয়েবলের সাথে কাজ করেন, আপনার কাছে যদি না করার ভাল কারণ না থাকে তবে সর্বদা এগুলি (ডাবল কোটে) উদ্ধৃত করুন এবং আপনি কী করছেন তা আপনি অবশ্যই জানেন।
স্কট

@ স্কট ঠিক আছে, আমি সংশোধন করছি :) আমি -permযুক্তিটি তিনটিরই প্রয়োজন হিসাবে পড়েছি , তাদের একজনের নয়। এছাড়াও, শেল আর্গুমেন্টগুলি সুরক্ষিত করার জন্য ইনপুট দেওয়ার জন্য আপনাকে ধন্যবাদ, এটাই আমি জানতাম না stuff
মার্ক ম্যাকেন্না

@ মার্ক ম্যাককেইনা আপনার এখানে একটি টাইপ আছে: for i in সন্ধান করুন। -প্রকার চ ; do [ -x $i ] && echo "$i is executable"; done; আপনি <dir> অংশটি নিখোঁজ করছেন যা আমি একটি বিন্দু (।) ব্যবহার করি
ডিভি

2

এক্সিকিউটেবল হিসাবে চিহ্নিত একটি ফাইল এক্সিকিউটেবল বা লোডযোগ্য ফাইল বা অবজেক্ট হওয়া দরকার না।

আমি যা ব্যবহার করি তা এখানে:

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

2
এটি কি করে?
DerMike

@ ডেরমাইক, বর্তমান ডিরেক্টরিতে এক্স। এক্স ফাইলগুলি কার্যকর করার সন্ধানের অন্যতম একটি উপায়, যদি কোনও ফাইল নির্বাহযোগ্য হিসাবে চিহ্নিত নাও হয় তবে এটি আবিষ্কার করতে পারে।
অজয় কুমারবাসুথকর

ঠিক আছে, আমি বলতে চাইছি, এটি কীভাবে এটি করে?
ডারমাইক

এটি আবিষ্কার করতে ফাইলের শিরোনাম থেকে পড়ে, প্রতিটি বাইনারি ফাইল বা স্ক্রিপ্ট ফাইলের শিরোনাম থাকে।
অজয় কুমারবাসুথকার

যতদূর আমি জানি, -name "*"এর কোনও প্রভাব নেই find- এটি সাধারণত সমস্ত ফাইল খুঁজে বের করে যা পরীক্ষাগুলি দ্বারা মুছে ফেলা হয় না।
জি ম্যান

1

ওয়ান লাইনারের ভক্ত হিসাবে ...

find /usr/bin -executable -type f -print0 | xargs file | grep ASCII

ফাইন্ড কমান্ড থেকে আউটপুট নিতে 'xargs' ব্যবহার করে (ফাঁকা ফাইল ফাইলের নাম সঠিকভাবে পরিচালনা করা যায় তা নিশ্চিত করতে মুদ্রণ0 ব্যবহার করে)। আমাদের কাছে এখন এক্সিকিউটেবল ফাইলগুলির একটি তালিকা রয়েছে এবং আমরা 'ফাইল' কমান্ডের প্যারামিটার হিসাবে একে একে একে সরবরাহ করি। তারপরে বাইনারি উপেক্ষা করার জন্য ASCII শব্দটির জন্য গ্রেপ করুন। আপনি কোন স্টাইলটি পছন্দ করেন (পূর্ববর্তী উত্তরগুলি দেখুন) বা আপনার 'এনআইএক্স ওএস'-এ কী কাজ করে তা অনুগ্রহ করে অনুসন্ধানের আদেশে বিকল্প নির্ধারণ করুন

রুটের মালিকানাধীন স্ক্রিপ্টগুলিতে আইওলযুক্ত ফাইলগুলি সন্ধানের জন্য আমার উপরেরটি প্রয়োজন ছিল, তাই বেসরকারী ক্রমবর্ধমান দুর্বলতাগুলি যেখানে রুট ব্যবহারকারীরা অনিরাপদ পরামিতিগুলির সাথে স্ক্রিপ্টগুলি চালায় সেগুলি খুঁজে পেতে সহায়তা করার জন্য নিম্নলিখিতটি তৈরি করা হয়েছিল ...

echo -n "+ Identifying script files owned by root that execute and have an eval in them..."
find /  -not \( -path /proc -prune \)  -type f -executable -user root -exec grep -l eval {} \; -exec file {} \; | grep ASCII| cut -d ':' -f1 > $outputDir"/root_owned_scripts_with_eval.out" 2>/dev/null &

স্ক্রিপ্টে নন-এসসিআইআই অক্ষর থাকলে এটি কাজ করবে না। fileএনকোডিংয়ের প্রতিবেদন করে, তাই অজগর স্ক্রিপ্ট হিসাবে রিপোর্ট করা যেতে পারে a /usr/bin/python script, UTF-8 Unicode text executablefind ... | xargs file -b | grep -v '^ELF'অ-বাইনারিগুলি স্পট করার জন্য আরও ভাল কাজ করতে পারে।
xenoid

0

আমি ~/.bashrcআজ রাতেই একটি ফাংশন তৈরি করেছি কার্যকর করার জন্য ফাইলগুলি সিস্টেমের পথে নেই এবং ডিরেক্টরিগুলি নয়:

# Quickly locate executables not in the path
xlocate () {
    locate -0r "$1" | xargs -0 -I{} bash -c '[[ -x "$1" ]] && [[ ! -d "$1" ]] \
        &&  echo "executable: $1"'  _  {}
} # xlocate ()

সুবিধাটি হ'ল এটি একটি সেকেন্ডের অধীনে তিনটি লিনাক্স ডিস্ট্রোস এবং একটি উইন্ডোজ ইনস্টলেশন অনুসন্ধান করবে যেখানে findকমান্ডটি 15 মিনিট সময় নেয়।

উদাহরণ স্বরূপ:

$ time xlocate llocate
executable: /bin/ntfsfallocate
executable: /home/rick/restore/mnt/e/bin/llocate
executable: /mnt/clone/bin/ntfsfallocate
executable: /mnt/clone/home/rick/restore/mnt/e/bin/llocate
executable: /mnt/clone/usr/bin/fallocate
executable: /mnt/e/bin/llocate
executable: /mnt/old/bin/ntfsfallocate
executable: /mnt/old/usr/bin/fallocate
executable: /usr/bin/fallocate

real    0m0.504s
user    0m0.487s
sys     0m0.018s

অথবা একটি সম্পূর্ণ ডিরেক্টরি এবং এটির জন্য সমস্ত সাবস:

$ time xlocate /mnt/e/usr/local/bin/ | wc -l
65

real    0m0.741s
user    0m0.705s
sys     0m0.032s
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.