দ্রষ্টব্য:
* এই উত্তরটি সম্ভবত ব্যবহারের মামলার পরোয়ানা থেকে গভীরতর find 2>/dev/nullহয় এবং অনেক পরিস্থিতিতে এটি যথেষ্ট ভালও হতে পারে। এটি এখনও ক্রস-প্ল্যাটফর্মের দৃষ্টিকোণ এবং কিছু উন্নত শেল কৌশলগুলির আলোচনার জন্য এটি সমাধানের স্বার্থে যতটা সম্ভব শক্তিশালী এটির পক্ষে আগ্রহী হতে পারে, যদিও এর বিরুদ্ধে রক্ষিত মামলাগুলি মূলত অনুমানযোগ্য হতে পারে।
* যদি আপনার সিস্টেমটি স্থানীয় ত্রুটি বার্তাগুলি দেখানোর জন্য কনফিগার করা থাকে তবে ইংরাজী বার্তাগুলি প্রতিবেদন করা হয়েছে তা নিশ্চিত করার জন্য findনীচের কলগুলিকে LC_ALL=C( LC_ALL=C find ...) এর সাথে পূর্ববর্তী করুন , যাতে এটি উদ্দেশ্য হিসাবে কাজ করে। Invariably অবশ্য কোনো ত্রুটি বার্তা না প্রদর্শিত পান, তারপরে ইংরেজিতে হিসাবে ভাল হতে হবে। grep -v 'Permission denied'
যদি আপনার শেলটি হয় bashবাzsh থাকে তবে যুক্তিযুক্ত সরল থাকাকালীন শক্তিশালী এমন একটি সমাধান রয়েছে যা কেবলমাত্র পসিক্স-সম্মতিযুক্ত findবৈশিষ্ট্যগুলি ব্যবহার করে ; bashনিজেই পসিক্সের অংশ না হলেও , বেশিরভাগ আধুনিক ইউনিক্স প্ল্যাটফর্মগুলি এর সাথে আসে, এই সমাধানটি ব্যাপকভাবে বহনযোগ্য:
find . > files_and_folders 2> >(grep -v 'Permission denied' >&2)
দ্রষ্টব্য: একটি ছোট্ট সম্ভাবনা রয়েছে যে কিছু শেষ হওয়ার পরে কিছু grepআউটপুট আসতে পারে , কারণ সামগ্রিক কমান্ড ভিতরে কমান্ডটি শেষ হওয়ার জন্য অপেক্ষা করে না । ইন , আপনি কমান্ডে যুক্ত করে এটি প্রতিরোধ করতে পারেন । find>(...)bash| cat
>(...)একটি (খুব কমই ব্যবহৃত) হয় আউটপুট প্রক্রিয়া প্রতিকল্পন আউটপুট পুনঃনির্দেশিত অনুমতি দেয় (এই ক্ষেত্রে, দ্বারা stderr আউটপুট ( 2>) কমান্ড ভিতরে stdin থেকে >(...)।
ছাড়াও bashএবং zsh, kshসমর্থন তাদের পাশাপাশি নীতিগতভাবে কিন্তু থেকে ফেরৎ করে সেগুলি একত্রিত করার চেষ্টা stderr , যেমন এখানে ( 2> >(...)) করা হয়েছে , নিঃশব্দে উপেক্ষা করা হবে (ইন ksh 93u+) বলে মনে হচ্ছে ।
grep -v 'Permission denied'( ) কমান্ডের স্টার্ডার স্ট্রিম থেকে) সমস্ত লাইন ফিল্টার করে যা বাক্যাংশটি ধারণ করে এবং বাকী রেখাগুলি স্ট্ডার ( ) এ আউটপুট করে ।-vfindPermission denied>&2
এই পদ্ধতিটি হ'ল:
জোরালো : grepশুধুমাত্র ত্রুটি বার্তাগুলিতে প্রয়োগ করা হয় (এবং ফাইল পাথ এবং ত্রুটি বার্তাগুলির সংমিশ্রণে নয়, সম্ভাব্যভাবে মিথ্যা ধনাত্মক দিকে পরিচালিত করে) এবং অনুমতি-প্রত্যাখাত হওয়াগুলি ব্যতীত অন্য ত্রুটি বার্তাগুলি স্ট্যাডারকে দেওয়া হয়।
পার্শ্ব-প্রতিক্রিয়া মুক্ত : findএর প্রস্থান কোডটি সংরক্ষণ করা হয়েছে: অন্ততপক্ষে ফাইল-সিস্টেম আইটেমগুলির মধ্যে একটিতে অ্যাক্সেসের অক্ষমতার ফলে প্রস্থান কোডের ফলাফল পাওয়া গেছে 1(যদিও এটি আপনাকে জানায় না যে অনুমতি-অস্বীকার হওয়াগুলি ব্যতীত অন্য কোনও ত্রুটি ঘটেছে (খুব বেশি))।
পসিক্স-সম্মতিযুক্ত সমাধান:
সম্পূর্ণ পসিক্স-কমপ্লায়েন্ট সমাধানগুলির সীমাবদ্ধতা থাকে বা অতিরিক্ত কাজের প্রয়োজন হয়।
যদি findআউটপুট যেকোন উপায়ে কোনও ফাইলের ক্যাপচার করতে হয়, বা জোনাথন লেফ্লারের উত্তর থেকে পাইপলাইন-ভিত্তিক সমাধানটি সহজ, দৃ ,় এবং পসিএক্স-সম্মতিযুক্ত:
find . 2>&1 >files_and_folders | grep -v 'Permission denied' >&2
মনে রাখবেন যে পুনঃনির্দেশগুলির ক্রমটি গুরুত্বপূর্ণ: প্রথমে2>&1 আসবে ।
সামনে একটি ফাইল স্টাডআউট আউটপুট ক্যাপচার কেবল পাইপলাইনের মাধ্যমে কেবল ত্রুটি বার্তা 2>&1প্রেরণ করতে দেয় , যা পরে নির্বিঘ্নে কাজ করতে পারে।grep
শুধুমাত্র downside হয় যে সামগ্রিক প্রস্থান কোড হতে হবে grepকমান্ডের না findযদি সেখানে আছেন: এর, যা এই ক্ষেত্রে অর্থ হলো কোন সব বা ত্রুটি শুধুমাত্র অনুমতি-বঞ্চিত ত্রুটি, প্রস্থান কোড করা হবে 1(সংকেত ব্যর্থতা ), অন্যথায় ( অনুমতি-অস্বীকার হওয়া ব্যতীত ত্রুটিগুলি) 0- যা উদ্দেশ্যটির বিপরীত।
এটি বলেছিল, findএর বহির্গমন কোডটি খুব কমই ব্যবহৃত হয় , কারণ এটি প্রায়শই অ-অস্তিত্বহীন পথ অতিক্রম করার মতো মৌলিক ব্যর্থতার বাইরে অল্প তথ্য সরবরাহ করে ।
যাইহোক, এমনকি কিছু নির্দিষ্ট ক্ষেত্রেইনপুট পাথ অনুমতি অভাবে দুর্গম হচ্ছে হয় প্রতিফলিত findএর প্রস্থান কোড (উভয় গনুহ ও বাসদের মধ্যে find): একটি অনুমতি-বঞ্চিত ত্রুটি দেখা দেয় যদি জন্য কোন প্রক্রিয়া ফাইল, প্রস্থান কোড সেট করা হয় 1।
নিম্নলিখিত পার্থক্য সম্বোধন করে:
find . 2>&1 >files_and_folders | { grep -v 'Permission denied' >&2; [ $? -eq 1 ]; }
এখন, প্রস্থান কোডটি অন্য কোনও ত্রুটি Permission deniedঘটেছে কিনা তা নির্দেশ করে : 1যদি তা হয় তবে 0অন্যথায়।
অন্য কথায়: প্রস্থান কোডটি এখন কমান্ডের প্রকৃত অভিপ্রায়াকে প্রতিফলিত করে: সাফল্য ( 0) রিপোর্ট করা হয়েছে, যদি কোনও ত্রুটি না থাকে বা কেবল অনুমতি-অস্বীকার ত্রুটি ঘটে থাকে।
এটি findশীর্ষে সমাধান হিসাবে যেমন কেবল প্রস্থান কোডটি পাস করার চেয়ে তর্কযুক্ত এমনকি আরও ভাল ।
gniourf_gniourf মন্তব্যের সংখ্যা (এখনও POSIX-অনুবর্তী) প্রস্তাব এই সমাধান অত্যাধুনিক পুনঃনির্দেশগুলি ব্যবহারের সাধারণীকরণ , যা ফাইল পাথ মুদ্রণ ডিফল্ট ব্যবহারকে এমনকি কাজ করে stdout- এ :
{ find . 3>&2 2>&1 1>&3 | grep -v 'Permission denied' >&3; } 3>&2 2>&1
সংক্ষেপে: কাস্টম ফাইল বর্ণনাকারী 3অস্থায়ীভাবে stdout ( 1) এবং stderr ( 2) অদলবদল করতে ব্যবহৃত হয় , যাতে ত্রুটি বার্তাগুলি একাgrep stdout এর মাধ্যমে পাইপ করা যায়।
এই পুনঃনির্দেশগুলি ছাড়াই, ডেটা (ফাইলের পাথ) এবং ত্রুটি বার্তাগুলি উভয়ই grepস্টাডাউটের মাধ্যমে পাইপ করা grepহত এবং এরপরে ত্রুটি বার্তা Permission denied এবং একটি (অনুমান) ফাইলের মধ্যে পার্থক্য করতে সক্ষম হবে না যার নামটি বাক্যাংশটি ধারণ করে Permission denied।
প্রথম সমাধান হিসাবে, তবে, উল্লিখিত প্রস্থান কোডটি হ'ল grepনয় find, তবে উপরের মত একই ফিক্স প্রয়োগ করা যেতে পারে।
বিদ্যমান উত্তরের উপর নোট:
বিভিন্ন পয়েন্ট সম্পর্কে খেয়াল করা হয় মাইকেল Brux এর উত্তর , find . ! -readable -prune -o -print:
এটির জন্য জিএনইউ প্রয়োজন find; উল্লেখযোগ্যভাবে, এটি ম্যাকস-এ কাজ করবে না। অবশ্যই, যদি আপনার GNU এর সাথে কাজ করার জন্য কেবল কমান্ডের প্রয়োজন হয় তবে এটি findআপনার সমস্যা হবে না।
কিছু Permission deniedত্রুটি এখনও তলিয়ে যেতে পারে : ডিরেক্টরিগুলির চাইল্ড আইটেমগুলির find ! -readable -pruneজন্য এই জাতীয় ত্রুটিগুলি প্রতিবেদন করে যার জন্য বর্তমান ব্যবহারকারীর অনুমতি রয়েছে, তবে (কার্যকর করার যোগ্য) অনুমতি নেই। কারণ কারণ ডিরেক্টরির নিজেই হয় পাঠযোগ্য, মৃত্যুদন্ড কার্যকর নয় এবং অবতরণ করেন প্রয়াস মধ্যে ডিরেক্টরিটি তারপর ত্রুটি বার্তা আরম্ভ করে। তাই বলা হয়, সাধারণত ক্ষেত্রে জন্য অনুমতি অনুপস্থিত করা হবে।rx-pruner
দ্রষ্টব্য: নীচের বিষয়টি দর্শনের এবং / অথবা নির্দিষ্ট ব্যবহারের বিষয়, এবং আপনি সিদ্ধান্ত নিতে পারেন যে এটি আপনার পক্ষে প্রাসঙ্গিক নয় এবং আদেশটি আপনার প্রয়োজনীয়তার সাথে খাপ খায়, বিশেষত যদি পথগুলি মুদ্রণ করা হয় তবে:
- আপনি যদি অনুমতি-অস্বীকৃত ত্রুটি বার্তাগুলির ফিল্টারিংকে কোনও পৃথক টাস্কটি প্রয়োগ করতে চান যা আপনি কোনও
find কমান্ডের প্রয়োগ করতে সক্ষম হতে চান , তবে অনুমতি-অস্বীকৃত ত্রুটিগুলি সক্রিয়ভাবে প্রতিরোধের বিপরীত পদ্ধতির জন্য findকমান্ডের মধ্যে "শব্দ" প্রবর্তন করা প্রয়োজন , যা প্রবর্তন করে জটিলতা এবং লজিক্যাল ফাঁদ ।
- উদাহরণস্বরূপ, মাইকেল এর উত্তরে সর্বাধিক ভোট প্রাপ্ত মন্তব্য (এই লেখার মতো) ফিল্টার অন্তর্ভুক্ত করে কমান্ডটি কীভাবে প্রসারিত করতে হবে তা দেখানোর চেষ্টা করেছে
-name:
find . ! -readable -prune -o -name '*.txt'
এটি অবশ্য উদ্দেশ্য অনুসারে কাজ করে না , কারণ অনুসরণ করার -printক্রিয়া প্রয়োজনীয় (একটি উত্তর এই উত্তর পাওয়া যাবে )। এ জাতীয় সূক্ষ্মতাগুলি বাগগুলি প্রবর্তন করতে পারে।
প্রথম সমাধান জনাথন Leffler এর উত্তর , find . 2>/dev/null > files_and_folders, যেমন তিনি নিজে রাজ্য, অন্ধ নীরব সব ত্রুটি বার্তা (এবং কার্যসংক্রান্ত, কষ্টকর এবং সম্পূর্ণরূপে শক্তসমর্থ নয় তিনি এও ব্যাখ্যা)। বাস্তবিকভাবে বলতে গেলে , এটি সহজ সমাধান , কারণ আপনি যে কোনও এবং সমস্ত ত্রুটি অনুমতি-সম্পর্কিত হতে পারে তা অনুমান করে সন্তুষ্ট হতে পারেন।
কুয়াশা এর উত্তর , sudo find . > files_and_folders, সংক্ষিপ্ত এবং বাস্তবমুখী কিন্তু নিছক ছাড়া অন্য কিছুর জন্য অবিবেকী হয় মুদ্রণ ফাইলের নামের সুরক্ষা জনিত কারণে কারণ আপনি চালাচ্ছেন রুট ব্যবহারকারী, "আপনার পুরো সিস্টেমের থাকার খুঁজুন একটি বাগ দ্বারা বিশৃঙ্খলার সৃষ্টি হচ্ছে ঝুঁকি বা একটি দূষিত সংস্করণ, বা একটি ভুল অনুরোধ যা অপ্রত্যাশিতভাবে কিছু লিখেছে, যা আপনি যদি সাধারণ সুযোগ-সুবিধাগুলি দিয়ে চালিয়েছিলেন তবে এটি ঘটতে পারে না "( ট্রিপলির মাধ্যমে মিস্টের উত্তরের মন্তব্য থেকে )।
ভাইরাপ্টরের উত্তরের ২ য় সমাধান , find . 2>&1 | grep -v 'Permission denied' > some_fileমিথ্যা পজিটিভগুলির ঝুঁকি (পাইপলাইনের মাধ্যমে স্টাডাউট এবং স্টার্ডারের মিশ্রণ প্রেরণের কারণে) চালায় এবং সম্ভাব্যত স্ট্যাডারের মাধ্যমে অ -প্রসারণ-অস্বীকৃত ত্রুটিগুলি রিপোর্ট করার পরিবর্তে আউটপুট পাথের পাশাপাশি সেগুলি ধারণ করে আউটপুট ফাইল।
find . 2>&1 > files_and_folders | grep -v 'Permission denied' >&2?