একটি -exec
কমান্ড একটি দিয়ে শেষ করা করা আবশ্যক ;
(তাই আপনি সাধারণত টাইপ করতে হবে \;
অথবা ';'
বা শেল দ্বারা এড়ানোর interpretion করার জন্য) +
। পার্থক্যটি হ'ল ;
, ফাইলটি প্রতি কমান্ডটি একবার কল করা হয়, সাথে +
এটি একেবারে কম কয়েকবার বলা হয় (সাধারণত একবার হলেও কমান্ড লাইনের সর্বাধিক দৈর্ঘ্য থাকে, তাই এটি বিভক্ত হতে পারে) সমস্ত ফাইলের সাথে । এই উদাহরণটি দেখুন:
$ cat /tmp/echoargs
#!/bin/sh
echo $1 - $2 - $3
$ find /tmp/foo -exec /tmp/echoargs {} \;
/tmp/foo - -
/tmp/foo/one - -
/tmp/foo/two - -
$ find /tmp/foo -exec /tmp/echoargs {} +
/tmp/foo - /tmp/foo/one - /tmp/foo/two
আপনার আদেশের দুটি ত্রুটি রয়েছে:
প্রথমত, আপনি ব্যবহার করেন {};
তবে ;
অবশ্যই এটির নিজস্ব একটি প্যারামিটার হওয়া উচিত।
দ্বিতীয়ত, কমান্ডটি শেষ হয় &&
। আপনি "রান ফাইন্ড" নির্দিষ্ট করেছেন এবং যদি এটি সফল হয় তবে নামকৃত ফাইলটি সরান {};
। আপনি যদি -exec
কমান্ডের শেল স্টাফ ব্যবহার করতে চান , আপনার এটি স্পষ্টভাবে শেলটিতে চালানো দরকার, যেমন -exec sh -c 'ffmpeg ... && rm'
।
তবে আপনার বাশ কমান্ডের মধ্যে {add যুক্ত করা উচিত নয়, বিশেষ অক্ষরগুলি উপস্থিত থাকলে এটি সমস্যা তৈরি করবে। পরিবর্তে, আপনি শেলের অতিরিক্ত পরামিতিগুলি পরে -c command_string
(দেখুন man sh
) পাস করতে পারেন :
$ ls
$(echo damn.)
$ find * -exec sh -c 'echo "{}"' \;
damn.
$ find * -exec sh -c 'echo "$1"' - {} \;
$(echo damn.)
আপনি $
প্রথম উদাহরণে শেলটি দিয়ে জিনিসটি মূল্যায়ন করে দেখুন। কল করুন $(rm -rf /)
:-) নামে একটি ফাইল রয়েছে
(পার্শ্ব নোট: -
প্রয়োজন নেই, তবে কমান্ডটি ভেরিয়েবলের পরে নির্ধারিত হওয়ার পরে প্রথম ভেরিয়েবল $0
, যা একটি বিশেষ ভেরিয়েবল যা সাধারণত প্রোগ্রামটি চালিত হয় এবং একটি প্যারামিটারে সেট করা কিছুটা অপরিষ্কার, যদিও এটি জিতেছিল সম্ভবত এখানে কোনও ক্ষতির কারণ হবে না, তাই আমরা সেটাকে ঠিক করে -
দিয়ে শুরু করি $1
))
সুতরাং আপনার আদেশ কিছু হতে পারে
find -exec bash -c 'ffmpeg -i "$1" -sameq "$1".mp3 && rm "$1".mp3' - {} \;
কিন্তু একটি ভাল উপায় নেই। সমর্থন সন্ধান করুন and
এবং or
, যাতে আপনি পছন্দসই জিনিসগুলি করতে পারেন find -name foo -or -name bar
। তবে এটি এর সাথেও কাজ করে -exec
, যা কমান্ডটি সফলভাবে প্রস্থান করা হলে সত্য হিসাবে মূল্যায়ন করে এবং যদি না হয় তবে এটি মিথ্যা হয়। এই উদাহরণটি দেখুন:
$ ls
false true
$ find * -exec {} \; -and -print
true
এটি কেবল মুদ্রণটি চালায় যদি কমান্ডটি সফলভাবে হয়, যা এটির জন্য হয়েছিল true
তবে এটির জন্য নয় false
।
সুতরাং আপনি একটি দ্বারা শৃঙ্খলিত দুটি -and
এক্সিকিউটমেন্ট বিবৃতি ব্যবহার করতে পারেন , এবং এটি কেবল পরে কার্যকর করা হয় যদি প্রাক্তন সফলভাবে চালানো হয়।