সন্ধান করুন-এক্সেক সেন্টিমিটার {} + বনাম | xargs


115

খুব বড় ফাইলগুলির মধ্যে কোনটি আরও দক্ষ এবং এটি ব্যবহার করা উচিত?

find . -exec cmd {} +

অথবা

find . | xargs cmd

(ধরে নিন যে ফাইলের নামগুলিতে কোনও মজার অক্ষর নেই)


উত্তর:


107

গতির পার্থক্য নগণ্য হবে।

তবে আপনাকে এটি নিশ্চিত করতে হবে:

  1. আপনার স্ক্রিপ্ট ধরে নিবে না যে কোনও ফাইলের ফাইলের নামে জায়গা, ট্যাব ইত্যাদি থাকবে না; প্রথম সংস্করণটি নিরাপদ, দ্বিতীয়টি নয়।

  2. আপনার স্ক্রিপ্ট " -" দিয়ে শুরু করা কোনও ফাইলকে বিকল্প হিসাবে বিবেচনা করবে না ।

সুতরাং আপনার কোডটি দেখতে এমন হওয়া উচিত:

find . -exec cmd -option1 -option2 -- {} +

অথবা

find . -print0 | xargs -0 cmd -option1 -option2 --

প্রথম সংস্করণটি সংক্ষিপ্ত এবং সহজ লেখার জন্য আপনি 1 টি -exec cmd {} +এড়াতে পারবেন, তবে দ্বিতীয় সংস্করণটি আরও পোর্টেবল এবং নিরাপদ, কারণ জিএনইউ আবিষ্কারুগুলিতে " " তুলনামূলকভাবে নতুন বিকল্প (2005 সাল থেকে প্রচুর চলমান সিস্টেমে এটি এখনও থাকবে না) এবং এটি সম্প্রতি বগি ছিল । এছাড়াও প্রচুর লোকেরা এটি " -exec cmd {} +" জানেন না , যেমন আপনি অন্যান্য উত্তর থেকে দেখতে পারেন।


4
-প্রিন্ট0 একটি জিএনইউ অনুসন্ধান (এবং জিএনইউ xargs) বিকল্প যা অনেকগুলি নন-লিনাক্স সিস্টেম থেকে অনুপস্থিত, সুতরাং বহনযোগ্যতার যুক্তিটি বৈধ নয়। শুধু -print ব্যবহার এবং xargs এর -0 বন্ধ রেখে অবশ্য হয় খুব পোর্টেবল।
ড্যানিসাউয়ার

7
মুল বক্তব্যটি হ'ল -প্রিন্ট0 ব্যতীত কোনও স্থান বা ট্যাব ইত্যাদির সাথে ফাইল থাকলে এটি কাজ করে না এটি একটি সুরক্ষার ঝুঁকি হতে পারে যেমন "foo -o index.html" এর মতো কোনও ফাইলের নাম থাকলে -o চিকিত্সা করা হবে একটি বিকল্প হিসাবে। খালি ডিরেক্টরিতে চেষ্টা করুন: "টাচ - foo o -o \ index.html; সন্ধান করুন। | xargs বিড়াল"। আপনি পাবেন: "বিড়াল: অবৈধ বিকল্প - 'ও'"
টমেটজকি

2
তার উদাহরণটি এমন একটি ফাইল নাম যা এতে একটি - থাকে। -প্রিন্ট0 ব্যতীত সন্ধান করুন ./foo -o সূচিপত্র। Html। সুতরাং সম্ভবত কোনও - দিয়ে শুরু করা কোনও বড় বিষয় নয়, তবে ফলাফলটি সামান্য পরিবর্তিত হয়েছে এবং কোনও মাল্টিউজার সিস্টেমে যদি আপনার স্ক্রিপ্টটি বিশ্বব্যাপী পাঠযোগ্য হয় তবে আক্রমণ আক্রমণকারী সরবরাহ করতে পারে।
ববপল

2
আমাকে এখানে ছড়িয়ে দিয়েছে এমন কোনও জিনিসের একটি নোট - execফলাফলগুলি যেমন পাওয়া গেছে তার ফলাফল হিসাবে ব্যবহার xargsকরবে, তবে মনে হয় স্টাডআউটে লেখার আগে পুরো ডিরেক্টরিটি অনুসন্ধান না হওয়া পর্যন্ত অপেক্ষা করুন। যদি আপনি এটি একটি বৃহত ডিরেক্টরিতে চেষ্টা করে দেখছেন, এবং মনে হচ্ছে এটি xargsকাজ করছে না, ধৈর্য্য ধরে রাখার পরামর্শ দেওয়া হচ্ছে।
FarmerGedden

1
@ মোটিভেটেড ছাড়া -print0রিটার্নের ফাইলের নামগুলি নিউলাইন দিয়ে পৃথক করা হয়, তবে নিউলাইনও এটিকে অস্পষ্ট করে তোলে এমন একটি ফাইল নামের অংশ হতে পারে। বাইট 0 পারে না, সুতরাং এটি নিরাপদ বিভাজক। হ্যাঁ - --একটি কমান্ডে সমর্থন করা যা এটি সমর্থন করে এটি একটি ভাল অনুশীলন যখন আপনি এর যুক্তিগুলি নিয়ন্ত্রণ করতে পারবেন না, এমনকি যদি সর্বদা কঠোরভাবে প্রয়োজনীয় বা অনিরাপদ নাও থাকে।
টমেটজকি

7
find . | xargs cmd

আরও দক্ষ (এটি প্রতিটি ম্যাচের জন্য একবার cmdদৌড়ে বিপরীতে exec, এটি যতবার সম্ভব চালিত হয় cmd)। যাইহোক, যদি ফাইলের নামগুলিতে ফাঁকা জায়গা বা মজাদার অক্ষর থাকে তবে আপনি সমস্যার মধ্যে পড়ে যাবেন।

নিম্নলিখিত ব্যবহার করার পরামর্শ দেওয়া হচ্ছে:

find . -print0 | xargs -0 cmd

এমনকি যদি ফাইলের নামের ভীতু অক্ষর থাকতে কাজ করবে ( -print0তোলে findNUL-সমাপ্ত ম্যাচ মুদ্রণ -0তোলে xargsএই বিন্যাসে আশা।)


28
এটি "সন্ধান করুন।-এক্সেক সেন্টিমিটার {} \;" নয় তবে "সন্ধান করুন ex এক্সেক্স সেন্টিমিটার {} +"। দ্বিতীয়টি একবারে একটি ফাইল চালাবে না।
টমেটজকি

2
মনে রাখবেন যে xargsকোনও ফাইলের (বা কেবল কয়েকটি) মিলে যাওয়া ফাইলগুলি cmdনা থাকলে এবং প্রতিটি ফাইলের জন্য খুব বেশি কিছু করার না থাকলে অ্যাপ্রোচটি আসলে উল্লেখযোগ্যভাবে ধীর হয় । উদাহরণস্বরূপ, খালি ডিরেক্টরিতে চালিত হওয়ার পরে, xargsসংস্করণটি কমপক্ষে দ্বিগুণ সময় নেবে, যেহেতু কেবল একটির পরিবর্তে দুটি প্রক্রিয়া শুরু করা উচিত। (হ্যাঁ, পার্থক্যটি সাধারণত *
নিক্সে অনিবার্য

2

আধুনিক xargsসংস্করণগুলি প্রায়শই সমান্তরাল পাইপলাইন কার্যকর করতে সহায়তা করে।

একথাও ঠিক যে, এটি একটি পিভট পয়েন্ট হতে পারে যখন এটি মধ্যে পছন্দ আসে find … -exec এবং … | xargs

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