কাটা তুচ্ছ কিন্তু বেমানান উত্তর বন্ধ করতে প্রথম: আমি তন্ন তন্ন ব্যবহার করতে পারেন find+ + xargsকৌতুক না এর রূপগুলো (যেমন findসঙ্গে -exec) কারণ আমি কলের জন্য প্রতি কয়েক ধরনের এক্সপ্রেশন ব্যবহার করতে হবে। আমি এই শেষে ফিরে পাবেন।
এখন আরও একটি ভাল উদাহরণের জন্য বিবেচনা করা যাক:
$ find -L some/dir -name \*.abc | sort
some/dir/1.abc
some/dir/2.abc
some/dir/a space.abc
আমি কীভাবে এগুলিকে যুক্তি হিসাবে পাস করব program?
কেবল এটি করা কৌশলটি করে না
$ ./program $(find -L some/dir -name \*.abc | sort)
programনিম্নলিখিত যুক্তি পাওয়ার পরে ব্যর্থ :
[0]: ./program
[1]: some/dir/1.abc
[2]: some/dir/2.abc
[3]: some/dir/a
[4]: space.abc
যেমন দেখা যায়, স্থান সহ পথটি বিভক্ত ছিল এবং programএটিকে দুটি পৃথক যুক্তি হিসাবে বিবেচনা করে।
এটি কাজ না হওয়া পর্যন্ত উদ্ধৃতি
মনে হয় আমার মতো নবজাতক ব্যবহারকারীরা যখন এ জাতীয় সমস্যার মুখোমুখি হন, অবশেষে এটি কাজ না করা পর্যন্ত এলোমেলোভাবে উদ্ধৃতি যুক্ত করার ঝোঁক থাকে - কেবল এখানে এটি সাহায্য করবে বলে মনে হয় না…
"$(…)"
$ ./program "$(find -L some/dir -name \*.abc | sort)"
[0]: ./program
[1]: some/dir/1.abc
some/dir/2.abc
some/dir/a space.abc
যেহেতু উদ্ধৃতিগুলি শব্দ বিভাজন প্রতিরোধ করে, সমস্ত ফাইল একক যুক্তি হিসাবে পাস করা হয়েছে।
পৃথক পথ উদ্ধৃত করা
একটি প্রতিশ্রুতিবদ্ধ পদ্ধতির:
$ ./program $(find -L some/dir -name \*.abc -printf '"%p"\n' | sort)
[1]: "some/dir/1.abc"
[2]: "some/dir/2.abc"
[3]: "some/dir/a
[4]: space.abc"
উদ্ধৃতি অবশ্যই আছে। তবে তাদের আর ব্যাখ্যা করা হয় না। তারা কেবল স্ট্রিংয়ের অংশ। সুতরাং তারা কেবল শব্দ বিভাজন রোধই করেনি, তারা যুক্তিতেও জড়িয়ে পড়ে!
আইএফএস পরিবর্তন করুন
তারপরে আমি চারপাশে খেলার চেষ্টা করেছি IFS। আমি পছন্দ করেন findসঙ্গে -print0এবং sortসঙ্গে -zযাহাই হউক না কেন - তাই যে তারা "ওয়্যার্ড পাথ" নিজেদের কোন সমস্যা থাকবে না। তাহলে কেন শব্দটিকে nullচরিত্রের উপর বিভাজন করতে বাধ্য করা এবং সব কিছু নেই?
$ ./program $(IFS=$'\0' find -L some/dir -name \*.abc -print0 | sort -z)
[0]: ./program
[1]: some/dir/1.abcsome/dir/2.abcsome/dir/a
[2]: space.abc
সুতরাং এটি এখনও স্পেসে বিভক্ত হয় এবং বিভক্ত হয় না null।
আমি IFSঅ্যাসাইনমেন্টটি উভয় $(…)(উপরে দেখানো হিসাবে) এবং আগে রাখার চেষ্টা করেছি ./program। এছাড়াও আমি অন্য সিনট্যাক্স চেষ্টা মত \0, \x0, \x00উভয় সঙ্গে উদ্ধৃত 'এবং "সঙ্গে ছাড়া সেইসাথে $। এগুলির মধ্যে কোনওরকমই কোনও পার্থক্য মনে হয়নি ...
এবং এখানে আমি ধারণার বাইরে। আমি আরও কয়েকটি জিনিস চেষ্টা করেছিলাম তবে সমস্তগুলি তালিকাভুক্ত একই সমস্যাগুলিতে ডুবে গেছে বলে মনে হচ্ছে।
আমি আর কি করতে পারি? এটা আদৌ কি doable?
অবশ্যই, আমি programনিদর্শনগুলি গ্রহণ করতে পারি এবং নিজে অনুসন্ধান করতে পারি। এটি নির্দিষ্ট সিনট্যাক্সে ফিক্স করার সময় এটি অনেকগুলি দ্বিগুণ কাজ। ( grepউদাহরণস্বরূপ ফাইল সরবরাহের বিষয়ে কী ?)।
এছাড়াও আমি programপাথের একটি তালিকা সহ কোনও ফাইল গ্রহণ করতে পারি । তারপরে আমি সহজেই findকিছু অস্থায়ী ফাইলে এক্সপ্রেশন ডাম্প করতে পারি এবং কেবলমাত্র সেই ফাইলটির পথ সরবরাহ করতে পারি। এটি সরাসরি পাথের পাশাপাশি সমর্থিত হতে পারে যাতে ব্যবহারকারীর যদি কেবল একটি সরল পথ থাকে তবে এটি মধ্যবর্তী ফাইল ছাড়াই সরবরাহ করা যায়। তবে এটি দুর্দান্ত বলে মনে হচ্ছে না - অতিরিক্ত ফাইল তৈরি করা এবং তাদের যত্ন নেওয়া দরকার, অতিরিক্ত প্রয়োগের প্রয়োজনীয়তার কথা উল্লেখ করা উচিত নয়। (যাইহোক, এটি মামলার জন্য একটি উদ্ধার হতে পারে যেখানে যুক্তি হিসাবে ফাইলের সংখ্যা কমান্ড লাইনের দৈর্ঘ্যের কারণে সমস্যা সৃষ্টি করতে শুরু করে ...)
শেষে, আমি আপনাকে আবার স্মরণ করিয়ে দিই যে find+ xargs(এবং একই ধরণের) কৌশলগুলি আমার ক্ষেত্রে কার্যকর হবে না। বর্ণনা সরলতার জন্য আমি কেবল একটি যুক্তি প্রদর্শন করছি। তবে আমার আসল কেসটি আরও দেখতে এরকম দেখাচ্ছে:
$ ABC_FILES=$(find -L some/dir -name \*.abc | sort)
$ XYZ_FILES=$(find -L other/dir -name \*.xyz | sort)
$ ./program --abc-files $ABC_FILES --xyz-files $XYZ_FILES
সুতরাং একটি xargsঅনুসন্ধান থেকে একটি করা এখনও আমাকে কীভাবে অন্যটির সাথে ডিল করতে হবে তা ছেড়ে দেয় ...
mapfileএটিতে (বা এর প্রতিশব্দreadarray) কিছুই পাইনি । কিন্তু এটি কাজ করে!