অন্য 'ফাইন্ড-এক্সেক' এর মধ্যে 'ফাইন্ড-এক্সেক' বাসা বাঁধাই সম্ভব?


14

নীচের মতো কিছু হ'ল আমি যা করছি তার পরে, তবে আমার কোডটি কার্যকর হয় না, আমি কীভাবে পালাতে পারি {}এবং যাই হোক না কেন+ ;

find ./ -maxdepth 1 -type d -name '.*' -exec \
    find {} -maxdepth 1 -type f -name '*.ini' -exec \
        md5sum \{\} \\; \;

এই ইউনিক্স - এবং - লিনাক্স প্রশ্নটি দেখার পরে , আমি দেখতে পেয়েছি যে নিম্নলিখিত কোডটি কাজ করে, তবে এটি এর মতো সন্ধান করেও বাসা বাঁধে না এবং আমি সন্দেহ করি যে এই বিশেষ কাজটি করার আরও ভাল উপায় আছে।

find ./ -maxdepth 1 -type d -name '.*' \
-exec bash -c 'for x; do
    find "$x" -maxdepth 1 -type f -name "*.ini" \
    -exec md5sum \{\} \;; \
done' _ {} \+

find -execশেল (যেমন উপরে) এর সমস্ত বেহাল উদ্ধৃতি এবং পালানোর সীমাবদ্ধতা ছাড়াই বাসা বাঁধার কোন উপায় আছে?

অথবা এর বহু পরামিতিগুলির মিশ্রণ ব্যবহার করে এটি একটি একক ফাইন্ড কমান্ডে সরাসরি করা যেতে পারে?


4
আপনি যা জিজ্ঞাসা করছেন এটি করা সম্ভব হতে পারে, যখন জিনিসগুলি জটিল হয়, আমি শেল বা পার্ল স্ক্রিপ্টগুলিতে স্যুইচ করি। আপনার দ্বিতীয় কোড স্নিপেটটি কেবল শেল স্ক্রিপ্টের ইনলাইন সহ এটি করছে। বীরত্বপূর্ণ ওয়ান-লাইনারগুলি বিনোদন দেয় তবে তারা বুঝতে অসুবিধা হয় এবং এটি বজায় রাখা খুব শক্ত। যদি না হয় এটি একটি শট চুক্তি না হয় তবে তবুও আপনি কোনওভাবে ভাল হয়ে যাচ্ছেন, বুদ্ধিবৃত্তিক চ্যালেঞ্জ বাদে আমি এটি করার ভাল কারণ দেখতে পাচ্ছি না।
ওয়ারেন ইয়ং

1
@ ওয়ারেন ইয়ং: আমি অবশ্যই ধারণাটি জটিল বলে মনে করি না, তবে আমি ধরে নিয়েছি আপনার অর্থ হ'ল এর সাথে কাজ করার কোনও সহজ উপায় নেই findতবে যদি এটি findকরতে না পারেন তবে কেন হাতিয়ার হিসাবে findএত সম্মানিত (?)? ফাইলগুলি সন্ধানের জন্য ব্যবহার করতে চান? ... আমি পরবর্তীতে সন্ধান পেয়েছি যে find ./ -maxdepth 2 -path '.*/*.ini' -type f -exec md5sum {} \+আমার পরিস্থিতিতে ঠিক কাজ করে (jw013 এর রেফারেন্সটি -pruneআমাকে পুরুষ পৃষ্ঠায় নিয়ে এসেছিল), তবে আমি আশ্চর্য হয়েছি যদি এটি একটি শক্ত পদ্ধতি (জেনারিতে) হয়। আমি সত্যিই কখনই ব্যবহার করি নি find(লিনাক্সের এক বছরেরও কম সময়ের মধ্যে) যেমনটি locateআমার প্রয়োজন প্রায় সম্পন্ন হয়েছে তাই এটি অজানা অঞ্চল।
পিটার.ও

1
-pathপরীক্ষা ঠিক কি আমি আপনাকে পরামর্শ দিচ্ছি যাচ্ছে হয়।
এটির সাহায্যে

উত্তর:


8

আমি একটি একক অনুসন্ধান ব্যবহার করে চেষ্টা করব:

find .*/ -maxdepth 1 -type f -name '*.ini' -execdir md5sum {} +

বা এমনকি ( findমোটেও না, কেবল শেল গ্লোবিং)

md5sum .*/*.ini

যদিও এটির -type fচেকের অভাব রয়েছে তাই কেবলমাত্র যদি আপনার কোনও ডিরেক্টরি / অ-ফাইল শেষ না থাকে তবে কেবলমাত্র কাজ করে .ini। আপনি যদি আপনি ব্যবহার করতে পারে

for x in .*/*.ini; do 
    if [ -f "$x" ]; then 
        md5sum "$x"
    fi
done

যা কেবলমাত্র একটি এমডি 5সাম অনুরোধের সুবিধাটি হারাবে।

সম্পাদন করা

শৃঙ্খলার সাধারণ এবং নিরাপদ পদ্ধতির জন্য find, আপনি এর মতো কিছু করতে পারেন

find <paths> <args> -print0 | xargs -0 -I{.} find {.} <args for second find> [etc.]

আমি -f(এফ?) এর সাথে একটি ত্রুটি পেয়েছি এবং এর পরে অন্য একটি ত্রুটি -execdirপেয়েছি .. যখন আমি -execdir -- ecec এর সাথে প্রতিস্থাপন করি এবং / অথবা md5sum এর সাথে মুদ্রণও প্রতিস্থাপন করি তখন কিছুই পাই না ..
পিটার.ও

ধন্যবাদ, বিকল্পের জন্য ... তবে আমি findএটি ব্যবহার করে আরও কিছু করার পরে ... এটি এতটা নয় যে আমি কেবল এই উদাহরণটি সমাধান করতে চাই, আমি সন্ধানের ফুরো উপায়গুলি সম্পর্কে অন্তর্দৃষ্টি খুঁজছি ... ... সম্ভবত ফু-র চেয়ে আরও বেশি ফ্লফ হয়েছে .. (আমি জানি না, কারণ আমি কার্যত এটি কখনও ব্যবহার করি নি), এবং এটিই প্রথম পরিস্থিতি যা আমি সত্যিই এটি ব্যবহার করতে চেয়েছিলাম (চিত্রের ফাইলের জন্য আসলে) এবং -এই বৈশিষ্ট্যযুক্ত বৈশিষ্ট্যটি যা আমি শুনেছি তার প্রতিনিধি (?) এর কাছে ... (বিকল্পগুলির জন্য +1) এর চেয়ে বেশি শক্তিশালী বলে মনে হচ্ছে না .. তবে আপনার findউদাহরণটি এখনও কার্যকর হয় না (এখনও) )
পিটার.ও

findকমান্ডটির জন্য আমি এই ত্রুটিটি পেয়েছি : ... find: The relative path ~ / বিন 'PATH এনভায়রনমেন্ট ভেরিয়েবলের মধ্যে অন্তর্ভুক্ত রয়েছে, যা সন্ধানের-এক্সেকডির ক্রিয়াকলাপের সাথে সুরক্ষিত হয় না। দয়া করে entry পাঠাথের থেকে প্রবেশটি সরিয়ে দিন .... সুতরাং এটি কার্যকর হবে তবে আমি অবশ্যই বলতে পারি যে আমি কিছুক্ষণের জন্য সেই ~ / বিন থেকে মুক্তি পাওয়ার চেষ্টা করছি ... আমাকে আরও কিছু নিতে হবে এটি গুরুত্ব সহকারে দেখুন ... আমি জানি না আমি এটি কোথায় স্থাপন করেছি ... কোনও ধারণা যেখানে এটি লুকিয়ে থাকতে পারে; ~/binআমার পথ মধ্যে
Peter.O

আমি মনে করি যে findপরিস্থিতিগুলি পুরোপুরি গ্লোবগুলি দিয়ে সম্পন্ন করা যায় না, তবে তার শক্তির সর্বাধিক প্রশংসা হয় তবে এই ধরণের পরিস্থিতি বিরল হওয়ায় আমার সাধারণত খুব বেশি কিছু খুঁজে পাওয়ার দরকার নেই।
jw013

ঠিক আছে .. এটি একটি আকর্ষণীয় এবং ভাল পয়েন্ট (গ্লোব ব্যবহার সম্পর্কে) ...
পিটার.ও

2

আপনার আসল সমস্যাটির জন্য কলগুলি পুনরাবৃত্তভাবে অনুসন্ধানের প্রয়োজন হয় না তবে আমি মনে করি এটি বিন্দু ছিল না।

আমি বিশ্বাস করি যেভাবে আপনি চান পুনরাবৃত্তভাবে ফাইন্ডিং কল করা সম্ভব নয়।

নিম্নলিখিতগুলি পুনরাবৃত্তভাবে (বা নেস্টিং, এটি যাকেই বলা হয়) কল দিচ্ছে না, তবে আপনি কেবল প্রথম সন্ধানের ফলাফলের সেটটি নিতে পারবেন না এবং এটি দ্বিতীয়টিকে খাওয়াতে পারবেন না? আমি সহজাতভাবে এইভাবে করব:

find `find ./ -maxdepth 1 -type d -name '.*'` \
    -maxdepth 1 -type f -name '*.ini' -exec md5sum {} \;

xargsদ্বিতীয় সন্ধানটি কার্যকর করার জন্য আপনিও ব্যবহার করতে পারেন ।

হালনাগাদ:

আমি এটি যুক্ত করতে চেয়েছিলাম কারণ বেশিরভাগ ইউনিক্স ইউটিলিটিগুলি একের পরিবর্তে একাধিক ফাইল নাম যুক্তি নেয়, আপনি সাধারণত -execসম্পূর্ণরূপে এড়াতে পারেন :

md5sum `find \`find ./ -maxdepth 1 -type d -name '.*'\` -maxdepth 1 -type f -name '*.ini'`

ব্যাকটিক্স নেস্ট করার সময় আপনি কেবল \অভ্যন্তরগুলির আগে ব্যাকস্ল্যাশ যুক্ত করুন ।

যদি আমরা কল্পনা করি যে md5sumএটিতে কেবলমাত্র একটি ফাইলনাম আর্গুমেন্ট লাগে, আমরা সর্বদা এটি একটি forলুপে মুড়িয়ে রাখতে পারি :

for f in `find \`find ./ -maxdepth 1 -type d -name '.*'\` -maxdepth 1 -type f -name '*.ini'`
do
    md5sum $f
done

নোট করুন যে ফাইল / ডিরেক্টরি নাম অন্তর্ভুক্ত করা -বা একটি স্থান যুক্ত থাকলে এটি আরও কঠিন হয়ে ওঠে । ইউনিক্স ইউটিলিটিগুলি তাদের সাথে সুন্দরভাবে খেলবে না। সেক্ষেত্রে সংযোজন ./, --বা উদ্ধৃতি প্রয়োজন।

স্পষ্টতই আসল উদাহরণটি ভাল নয়, কারণ আমরা কেবল এটি করতে পারি:

md5sum .*/*.ini

1
আপনি পরিস্থিতির একটি ভাল ওভারভিউ দিয়েছেন, তবে ফাইল / ডিরেক্টরিতে ফাঁকা স্থান উপস্থিত দেখানো সমস্ত findপদ্ধতিই একটি ত্রুটি পেয়ে যায় ... md5sum .*/*.iniকাজটি ভাল ... আমি সাধারণ বোধ করতে শুরু করছি যে * ওয়ারেন ইয়ংয়ের * findগেমের শুরুতে জিনিসগুলি 'জটিল' হওয়ার বিষয়ে মন্তব্য করে :) তবে আমি ধরে নিচ্ছি findশর্ত পরীক্ষাগুলি আরও জটিল হওয়ার সাথে সাথে তার নিজের মধ্যে চলে আসে, তবে যতটা বাসা বেঁধে যায় - আমি ধারণাটি বেশ ভালভাবেই ফেলে দিয়েছি, যেহেতু মনে হচ্ছে এটি করার সহজ উপায় আছে .. (তবে পার্ল আমার কাছে এখনও "সহজ" নয়) ...
পিটার.ও

0

কমপক্ষে আমি 2 টি কমান্ডগুলি খুঁজে বাসাতে পেরেছি:

find ~ -maxdepth 1 -type d -name '.*' -execdir \
    find {} -maxdepth 1 -type f -name '*.ini' \;

তবে আমি অন্য-এক্সেক (দির) - কে সেখান থেকে ডাকার জন্য সমাধান করিনি।


হ্যাঁ, আমার সমস্যাটি
হ'ল

হ্যাঁ, তবে 3 বাসা বাঁধতে না 2 বাসা বাঁধাইয়ের মত নয় :) :)
ব্যবহারকারী অজানা
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.