ফাইন্ড-এক্সেক + বনাম সন্ধান | xargs: কোনটি বেছে নেবে?


32

আমি বুঝতে পারি যে এর আচরণ নকল করার জন্য -execএকটি +বিকল্প নিতে পারে xargs। এমন কোনও পরিস্থিতি আছে যেখানে আপনি অন্য ফর্মের চেয়ে একটি ফর্ম পছন্দ করবেন?

আমি ব্যক্তিগতভাবে প্রথম ফর্মটি পছন্দ করি, যদি কেবল পাইপ ব্যবহার না করা হয়। আমি অবশ্যই অনুমান করি যে বিকাশকারীরা findঅবশ্যই যথাযথ অপটিমাইজেশন করেছেন। আমি কি সঠিক?

উত্তর:


21

আপনি সন্ধানের জন্য কলগুলি চেন করতে চাইতে পারেন (একবার, যখন আপনি শিখেছিলেন যে এটি সম্ভব, যা আজ হতে পারে)। এটি অবশ্যই সম্ভব যতক্ষণ আপনি সন্ধানে থাকবেন। আপনি একবার জার্গে পাইপ করলে তা সুযোগের বাইরে চলে যায়।

ছোট উদাহরণ, দুটি ফাইল a.lst এবং b.lst:

cat a.lst
fuddel.sh
fiddel.sh

cat b.lst
fuddel.sh

এখানে কোনও কৌশল নয় - কেবলমাত্র উভয়টিতে "ফুডেল" রয়েছে তবে কেবল একটিতে "ফিদেল" থাকে।

ধরুন আমরা তা জানতাম না। আমরা একটি ফাইল অনুসন্ধান করি যা 2 শর্তের সাথে মেলে:

find -exec grep -q fuddel {} ";" -exec grep -q fiddel {} ";" -ls
192097    4 -rw-r--r--   1 stefan   stefan         20 Jun 27 17:05 ./a.lst

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

এবং মনে রাখবেন, আপনি অনুসরণ করতে পারে -exec খুঁজে , অপরকে খুঁজে কমান্ড মতো -ls বা -delete বা অনুরূপ কিছু। দ্রষ্টব্য, যে মুছে ফেলা কেবল আরএম করে না (ফাইলগুলি সরায়), কিন্তু rmdir (ডিরেক্টরিগুলিও সরিয়ে দেয়)।

এ জাতীয় শৃঙ্খলা একটি কমান্ডের একটি এবং সংশ্লেষ হিসাবে পড়া হয়, যতক্ষণ না অন্যথায় নির্দিষ্ট করা হয় (যথা একটি -orস্যুইচ (এবং পেরেনস (যা মাস্কিং প্রয়োজন)) সহ।)।

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

যদি আপনি বিশ্বাস করেন যে সন্ধানের }} ধনুর্বন্ধনীগুলির জন্য আপনার কিছু মুখোশ প্রয়োজন , আমার প্রশ্নটি বিনা দ্বিধায় পড়ুন যা প্রমাণ চেয়েছে। আমার জোর: আপনি না।


3
এই পোস্টটি ব্যবহার করার নতুন পদ্ধতিতে আমার চোখ খুলেছে find। অনেক ধন্যবাদ!
রাহমু

1
"আমি -xargs ব্যবহার করে কোনও সুবিধা দেখছি না"। চারটি কোরগুলির মধ্যে তিনটি অলস না -execথেকে এমনটি করার উপায় কী xargs -P4?
দামিয়ান ইয়ারিক 18

1
@ দামিয়ানইরিক: "-র মধ্যে নেই-এক্সেক কমান্ডটি শেষ করুন;" তবে একটি + (/ যোগ চিহ্ন) সহ।
ব্যবহারকারী অজানা

25

নিরাপদে ফাইলের নামগুলি পাইপ করার xargsজন্য আপনার বিকল্পটি findসমর্থন করে -print0এবং xargsএটি পড়ার জন্য ( --nullবা -0) সম্পর্কিত বিকল্প থাকতে পারে requires অন্যথায়, অরক্ষিত অক্ষর বা ব্যাকস্ল্যাশ বা উদ্ধৃতি বা নামে সাদা বাক্সের ফাইল নামগুলি অপ্রত্যাশিত আচরণের কারণ হতে পারে। অন্যদিকে, find -exec {} +হয় POSIX findবৈশিষ্ট , তাই এটি পোর্টেবল, এবং এটা যেমন নিরাপদ হিসাবে সম্পর্কে find -print0 | xargs -0, এবং স্পষ্টভাবে চেয়ে নিরাপদ find | xargs। আমি ছাড়া কখনও না করার পরামর্শ দিই ।find | xargs-print0


6
এর বহনযোগ্যতার একটি উল্লেখযোগ্য ব্যতিক্রম find … -exec … {} +হ'ল ওপেনবিএসডি, যা কেবলমাত্র 2012 সালে প্রকাশিত সংস্করণ 5.1 সহ এই বৈশিষ্ট্যটি অর্জন করেছিল All সমস্ত বিএসডি -print0বেশ কয়েক বছর ধরে এমনকি ওপেনবিএসডিও ছিল (যদিও এটি কিছুক্ষণের জন্য সেই বৈশিষ্ট্যটিকেও প্রতিহত করেছিল)। অন্যদিকে সোলারিস পসিক্স বৈশিষ্ট্যগুলিকে আঁকড়ে ধরেছে তাই আপনি পাবেন -exec +এবং না -print0
গিলস 'খারাপ হয়ে যাওয়া বন্ধ করুন'

-print0একটি ব্যথা এবং যদিও আপনি তর্ক করতে পারেন xargs --delimiter "\n"এটি সমতুল্য নয়, আমি পরেটি আবিষ্কার করার পরে কখনও কখনও আগেরটি ব্যবহার করিনি।
শ্রীধর সারনোবাত

3
আমি দেখতে পাচ্ছি না যে -0তার চেয়ে বেশি বেদনা কেমন হয় --delimiter "\n"
jw013

2
এছাড়াও -0, ইনপুট না থাকলে জিএনইউকে কমান্ড চালানো এড়ানো xargsদরকার -rto
স্টাফেন চেজেলাস

2
আরেকটি সমস্যা | xargs -r0 cmdহল cmdএর stdin প্রভাবিত হয় (তার উপর নির্ভর করে xargsপ্রয়োগ, এটা /dev/nullবা পাইপ।
Stéphane Chazelas

10

আপনি যদি -exec ... ;ফর্মটি ব্যবহার করেন (সেমিকোলন থেকে বাঁচার জন্য মনে রাখবেন), আপনি ফাইলের নাম অনুসারে একবার কমান্ডটি চালাচ্ছেন। আপনি যদি ব্যবহার-print0 | xargs -0 ফাইলের প্রতি একাধিক কমান্ড চালান। আপনার অবশ্যই -exec +ফর্মটি ব্যবহার করা উচিত , যা একক কমান্ড লাইনে একাধিক ফাইল রাখে এবং যখন প্রচুর সংখ্যক ফাইল জড়িত থাকে তখন আরও দ্রুত হয়।

ব্যবহারের একটি বড় প্লাস xargsহল সমান্তরালে ব্যবহার করে একাধিক কমান্ড চালানোর ক্ষমতা xargs -P। মাল্টি-কোর সিস্টেমে এটি প্রচুর সময় সাশ্রয় করতে পারে।


6
আপনি -Pপরিবর্তে বোঝানো হয়েছে -p। মনে রাখবেন xargs -Pপসিক্স স্ট্যান্ডার্ডের মধ্যে নেই, তবে find -exec {} +এটি হ'ল যদি আপনি বহনযোগ্যতার জন্য যাচ্ছেন তবে এটি গুরুত্বপূর্ণ।
jw013

@ অ্যালেক্সিয়াস আপনাকে প্লাস চিহ্নটি এড়াতে হবে না, কারণ এটি শেলের জন্য বিশেষ অর্থ রাখে না: find /tmp/ -exec ls "{}" +ঠিক কাজ করে।
ড্যানিয়েল কুলম্যান

1
অবশ্যই, অবশ্যই। আমি -execএত দিন ধরে সমস্ত কিছু থেকে পালিয়ে এসেছি (আমি একজন মাসোশিস্ট, পালানোর জন্য আমি কোটও ব্যবহার করি না {}, আমি সবসময় টাইপ করি \{\}; জিজ্ঞাসা করি না), সবকিছু দেখে মনে হচ্ছে এটি এখনই পালাতে হবে।
অ্যালেক্সিয়াস

1
@ অ্যালেক্সিয়াস: যদি আপনি এমন কোনও উদাহরণ খুঁজে পান (ম্যাসোচিস্ট হওয়া ব্যতীত) যেখানে ধনুর্বন্ধকের মাস্কিং দরকারী, দয়া করে এখানে আমার প্রশ্নের উত্তর হিসাবে এটি সরবরাহ করুন - আফিক এই ইঙ্গিতটি পুরানো এবং ম্যানপেজে কেবল একটি প্রতিলিপি lic আমি কখনও উদাহরণ দেখিনি যেখানে find /tmp/ -exec ls {} +কাজ হবে না।
ব্যবহারকারী অজানা

1
আমার জন্য, এটি সুনোস 4 এর দিনগুলিতে গঠিত পেশীগুলির স্মৃতি Since যেহেতু আমি এটি বছরের পর বছর ধরে করে চলেছি, তাই আমি যখন bashবন্ধনীগুলির ভারব্যাটিম গ্রহণ করতে শুরু করি তখন আমি সম্পূর্ণরূপে খেয়াল করতে ব্যর্থ হয়েছিল । আমি দৃ sure়ভাবে নিশ্চিত যে আমি যে পুরানো শেলগুলি ব্যবহার করেছি তার মধ্যে কমপক্ষে একটিতে হিসি ফিট নিক্ষেপ করা হয়েছে যদি ধনুগুলি বন্ধ না করা হয়।
অ্যালেক্সিয়াস

8

পারফরম্যান্স সম্পর্কে আমি ভেবেছিলাম যে -exec … +এটি কেবল ভাল হবে কারণ এটি একটি একক সরঞ্জাম যা সমস্ত কাজ করে তবে জিএনইউ ফাইন্ডিলের ডকুমেন্টেশনের একটি অংশ বলে যে -exec … +এটি কিছু ক্ষেত্রে কম দক্ষ হতে পারে:

[ব্যবহারের সাথে -exec … +] কিছু ব্যবহারের তুলনায় কম দক্ষ হতে পারে xargs; উদাহরণস্বরূপ xargs, পূর্ববর্তী কমান্ডটি কার্যকর হওয়ার সময় নতুন কমান্ড লাইনগুলি নির্মিত হতে দেয় এবং সমান্তরালে চালানোর জন্য আপনাকে বেশ কয়েকটি কমান্ড নির্দিষ্ট করতে দেয়। তবে, find ... -exec ... +নির্মাণের প্রশস্ত বহনযোগ্যতার সুবিধা রয়েছে। জিএনইউ আবিষ্কারকরা -exec ... +সংস্করণ 4.2.12 [জানুয়ারী 2005] অবধি ' ' সমর্থন করে না ; এর অন্যতম কারণ হ'ল এটি যে -print0কোনও ক্ষেত্রে ইতিমধ্যে ' ' পদক্ষেপ নিয়েছিল ।

আমি ঠিক নিশ্চিত ছিলাম না এর অর্থ কী তাই আমি আড্ডায় জিজ্ঞাসা করলাম যেখানে ডার্বার্ট এটি ব্যাখ্যা করেছেন:

findসম্ভবত -exec … +চলমান চলাকালীন পরবর্তী ব্যাচের ফাইলগুলি অনুসন্ধান করা চালিয়ে যেতে পারে , তবে তা হয় না।
find … | xargs …করে, কারণ তখন অনুসন্ধানটি একটি আলাদা প্রক্রিয়া, এবং পাইপ বাফারটি পূরণ না হওয়া পর্যন্ত এটি চলতে থাকে

(আমার দ্বারা ফর্ম্যাট করা।)

সুতরাং যে আছে। তবে যদি পারফরম্যান্সটি সত্যিই গুরুত্বপূর্ণ হয় তবে আপনাকে বাস্তববাদী বেঞ্চমার্কিং করতে হবে বা বরং নিজেকে এমনকি যদি এই জাতীয় ক্ষেত্রে শেল ব্যবহার করতে চান কিনা তা নিজেকে জিজ্ঞাসা করতে হবে।

এখানে এই সাইটে আমি মনে করি লোকেরা -exec … +যখনই সম্ভব ফর্মটি ব্যবহার করার পরামর্শ দেওয়া ভাল, কারণ এটি সহজ কারণ এবং অন্যান্য উত্তরগুলিতে এখানে উল্লিখিত কারণগুলির জন্য (উদাহরণস্বরূপ খুব বেশি চিন্তা না করেই অদ্ভুত ফাইলের নামগুলি পরিচালনা করা)।

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