যদি কোনও এক্সেক্স ব্যর্থ হয় তবে সন্ধান থেকে বিরতি


14

অপারেশনগুলির মধ্যে একটি যদি কোনও ফাইলে ব্যর্থ হয় findতবে এটির লেখার কোনও উপায় আছে কি -exec?

উদাহরণস্বরূপ ( javacকোনও প্রোগ্রাম হিসাবে সুবিধামত ব্যবহার করা হয় যা কিছু ফাইলে 1 এর প্রস্থান কোড ফেরত দিতে পারে এবং অন্য কোনও কারণে নয়):

$ echo "public classXX A{}" >> A.java
$ echo "public class B{}" >> B.java
$ find . -iname \*.java -exec javac {} \;
./A.java:1: error: class, interface, or enum expected
public classXX A{}
       ^
1 error

উপরের উদাহরণে, যদিও execফাইলটিতে অন A.javaব্যর্থ হয়েছে (এবং 1 এর প্রস্থান কোডটি ফেরত দিয়েছে), findকমান্ডটি এগিয়ে গিয়ে ফাইলটিও সংকলিত B.javaকরেছে। ভাঙ্গার কোন উপায় আছে findবা এর forপরিবর্তে আমার কিছু ফর্ম ব্যবহার করা উচিত ?

আমার সন্ধানের সংস্করণ:

$ find -version  | head -1
find (GNU findutils) 4.4.2

উত্তর:


5

আমি মনে করি...

find ... -exec sh -c 'cmd "$0" || kill $PPID' \{\} \;

... কারও জন্য কৌশলটি করা উচিত find


ধন্যবাদ @ গিলিস কি করে $0?
মাইকজারভেজ

1
$0sh -c( $1দ্বিতীয়টি, ইত্যাদি) - এর প্রথম যুক্তিটি হ'ল - প্রচলিতভাবে প্রোগ্রামটির নাম কার্যকর করা হচ্ছে, তবে এখানে আপনি একটি স্নিপেট চালাচ্ছেন, এবং যে ফাইলটির নাম প্রসেস করা হচ্ছে তা $0কিছুটা অর্থপূর্ণ করে তোলে (যেমন আপনি সহজেই দেখতে পাচ্ছেন) এটি মধ্যে ps)। চিন্তাভাবনার একটি বিদ্যালয় রয়েছে (যা আমি স্পষ্টতই অন্তর্ভুক্ত নই) যা জানিয়েছে যে $0সর্বদা কার্যকরযোগ্য হওয়া উচিত এবং আপনার লেখা sh -c 'cmd "$1" …' sh {}বা এমন কিছু লেখা উচিত ।
গিলস 'অশুভ হওয়া বন্ধ করুন'

@ গিলস - বেশ চতুর। অনেক ধন্যবাদ. প্রিস্কুলের পথে গাড়িতে করে আমি এটি বের করেছিলাম, তবে কয়েক মিনিটের জন্য আমাকে এটি সম্পর্কে ভাবতে হয়েছিল। এটি স্মার্ট - আমি এটি ব্যবহার করব। আসলে এটি আমার জন্য কী ক্লিক করেছে তা হ'ল একটি সম্পাদনা যা আমি মনে করি আপনার নিজের পোস্টে স্টিফেনের পড়াটি মনে পড়েছিল যেখানে তিনি find-sh $0একটি findবিবৃতি শেষে একটি যুক্ত করেছিলেন । এটি আমার মতে আরও কার্যকর বলে মনে হচ্ছে, যদিও আমি অনুমান করি যে আপনি দীর্ঘকাল যা পরে সবচেয়ে বেশি গুরুত্বপূর্ণ তা এটিই।
মাইকজারভেজ

এটি উপরের মামলার জন্য কাজ করছে না। find . -iname \*.java -exec sh -c 'javac "${0}" || kill '$$ {} \;ফাইল A.javaব্যর্থ হওয়ার পরে এবং এখনও, ফাইল বি জাভা সংকলিত হয়।
মার্কাস জুনিয়াস ব্রুটাস

@ মার্কাসজুনিয়াস ব্রুটাস - আমি এটি ঠিক করেছি। আপনার মন্তব্যটি আমার আগে দেখা উচিত ছিল। আবার, দুঃখিত।
মাইকজারভেজ

4

কমপক্ষে জিএনইউ দিয়ে findআপনি ব্যবহার করতে পারেন:

find ... -exec ... -o -quit

এক্সিকিউটটি কোথায় থামে এবং -o শুরু হয় তা পরিষ্কার করে দেওয়াতে আমার মনে হচ্ছে সমস্যা আছে। উভয় find . -iname \*.java -exec javac {} -o -quit \;এবং find . -iname \*.java -exec javac {} \; -o -quit \;ব্যর্থ (বিভিন্ন উপায়ে)
মার্কাস জুনিয়াস ব্রুটাস

@ মার্কাসজুনিয়াস ব্রুটাস \;এর প্রয়োজনে -exec(যেমন -o -quitএই ক্ষেত্রে আগে ) প্রয়োজন তবে অন্য কোথাও নেই।
হউক লেগেছে

2
ব্যবহার -exec ... -o -quitআমার পক্ষে কাজ করে না। এটি কোনও ফাইল প্রক্রিয়া করে না । তবে এই লাইন কাজ করে: find . -iname \*.java -not -exec javac '{}' \; -quit: -quitযদি বলা হয় -execমিথ্যা, অর্থাত্। শূন্য-সহ ফিরে আসে।
সাভান্তো

find . -iname \*.java -exec javac {} \; -o -quitএছাড়াও, কোনও ফাইল প্রক্রিয়া করতে ব্যর্থ। স্ট্রেঞ্জলি, find . -iname \* -exec echo 'foo' \; -o -quit আছে "প্রক্রিয়া" ফাইল।
মার্কাস জুনিয়াস ব্রুটাস

0

আপনার findম্যানুয়াল পরামর্শ । @ হউকের উত্তর আমাকে সন্ধান করতে অনুপ্রাণিত করেছে এবং কিউএনএক্সের অনুসন্ধানে একটি -abortবিকল্প রয়েছে যা জিএনইউ -quitবিকল্পটির মতো বলে মনে হচ্ছে । আমি ব্যবহার করি \(এবং \)গোষ্ঠীভুক্তিগুলি সরবরাহ করে এটি আমার জন্য কাজ করে:

find . -mtime -4 -name <pattern> \( -exec my_cmd {} \; -o  -abort \) 

দ্রষ্টব্য: প্যারেন্স ছাড়াই এটি প্রথম ফাইলটিতে বাতিল হয়।

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