সন্ধান করুন: -মুগ্ধের পক্ষে অনুপস্থিত যুক্তি


18

আমি নিম্নলিখিত কমান্ডটি চালানোর চেষ্টা করছি:

find a/folder b/folder -name *.c -o -name *.h -exec grep -I foobar '{}' +

এটি একটি ত্রুটি ফিরিয়ে দিচ্ছে:

find: missing argument to -exec

এই কমান্ডটিতে কী সমস্যা হয়েছে তা আমি দেখতে পাচ্ছি না, যেমনটি ম্যান পৃষ্ঠার সাথে মেলে বলে মনে হচ্ছে:

-exec কমান্ড {} +

-Exec বিকল্পের এই রূপটি নির্বাচিত ফাইলগুলিতে নির্দিষ্ট কমান্ড চালায়, তবে প্রতিটি নির্বাচিত ফাইলের নাম শেষে অন্তর্ভুক্ত করে কমান্ড লাইনটি নির্মিত হয়; কমান্ডের মোট চালকের সংখ্যা মিলিত ফাইলগুলির সংখ্যার তুলনায় অনেক কম হবে। কমান্ড লাইনটি একইভাবে নির্মিত হয়েছে যেমন xargs তার কমান্ড লাইনগুলি তৈরি করে। কমান্ডের মধ্যে '{}' কেবলমাত্র একটি উদাহরণ অনুমোদিত। কমান্ডটি শুরু ডিরেক্টরিতে কার্যকর করা হয়।

আমি চেষ্টাও করেছি:

find a/folder b/folder -name *.c -o -name *.h -exec grep -I foobar {} +
find a/folder b/folder -name *.c -o -name *.h -exec 'grep -I foobar' {} +
find a/folder b/folder -name *.c -o -name *.h -exec 'grep -I foobar' '{}' +
find a/folder b/folder -name "*.c" -o -name "*.h" -exec grep -I foobar '{}' +
find a/folder b/folder \( -name *.c -o -name *.h \) -exec grep -I foobar '{}' +
find a/folder b/folder -name *.c -o -name *.h -exec grep -I foobar '{}' \+

আপনি কি +শেষে পালানোর চেষ্টা করেছেন ? find a/folder b/folder -name *.c -o -name *.h -exec grep -I foobar '{}' \+
জায়েহেন্দ্রেন

3
আপনি জিএনইউর একটি পুরানো সংস্করণ ব্যবহার করছেন find। যদিও -exec cmd {} +ভেরিয়েন্টটি পসিক্স এবং 80 এর দশক থেকে পাওয়া যায়, জিএনইউ এটি সম্প্রতি যুক্ত করেছে (তুলনামূলকভাবে) সম্প্রতি (2005)। কি find --versionবলে?
স্টাফেন চেজেলাস 21

2
@ কোভেরাস, এটি তখনই হবে। -exec {} +2005 সালে 4.2.12 এ যুক্ত করা হয়েছিল older পুরানো জিএনইউতে পাওয়া যায়, -print0 | xargs -r0অনুরূপ কিছু পেতে আপনি (নন-পসিক্স) ব্যবহার করতে পারেন । 4.1১৯৯৪
স্টাফেন চেজেলাস

1
JRFerguson নির্দিষ্ট যে (একটি উত্তর সেটা মোছা হয়েছে) -nameপ্যাটার্ন আর্গুমেন্ট উদ্ধৃত করা উচিত: -name "*.c" -o -name "*.h"। এটি সত্য, যদিও এটি -execত্রুটির সাথে সম্পর্কিত নয় । আপনি লক্ষ্য করবেন যে অন্যান্য সমস্ত উত্তরগুলি ওয়াইল্ডকার্ডগুলিকে উদ্ধৃতিতে রেখেছিল, যদিও কেবল গিলসই এর উল্লেখ করেছেন। … (চালিয়ে যাওয়া)
জি-ম্যান

1
(চালিয়ে যাওয়া) ... জেলিয়াগ্রির উত্তরটি -name "*.[ch]"ব্যাখ্যা ছাড়াই নামটির অভিব্যক্তিটি ভেঙে দেয় । এতে কমান্ড লাইনটি সরল করার এবং বিশেষত, মুছে ফেলার সুবিধা রয়েছে  -o। জড়িত এক্সপ্রেশন সঠিকভাবে -oপাওয়া কঠিন। তোমার ভুল; যদি আপনার আদেশটি স্থির হয়ে থাকে যাতে এটি ত্রুটিযুক্ত না হয় (গিলসের উত্তরে) তবে এটি grepকেবল .hফাইলগুলিতে চলবে । আপনার করা দরকার '(' -name '*.c' -o -name '*.h' ')'
জি-ম্যান 20:

উত্তর:


18

আপনার চারপাশে থাকা একক উদ্ধৃতিগুলি আপনাকে সরিয়ে ফেলতে হবে {}। কমান্ডটি এভাবে সহজ করা যায়:

find a/folder b/folder -name "*.[ch]" -exec grep -I foobar {} +

আপনি যদি একটি প্রত্নতাত্ত্বিক GNU সন্ধান সংস্করণ ব্যবহার করেন তবে এটি এখনও কাজ করা উচিত:

find a/folder b/folder -name "*.[ch]" -exec grep -I foobar {} \;

ওহো, এগুলি ব্যাকটিকস নয় বরং উদ্ধৃতি হিসাবে বোঝানো হয়েছিল।
ডেভিড কেনেডি 21

{}শেলের কোনও নির্দিষ্ট অর্থ নেই বলে उद्धरणগুলি অকেজো হবে ।
jlliagre

ম্যান পৃষ্ঠাগুলি সন্ধান থেকে: "স্ট্রিং '{}' বর্তমান ফাইলের নাম দ্বারা প্রতিস্থাপন করা হয়েছে যেখানেই এটি কমান্ডের আর্গুমেন্টে দেখা যায়, কেবল যুক্তিগুলিতে যেখানে এটি একা থাকে তা নয়, অনুসন্ধানের কয়েকটি সংস্করণে in শেল দ্বারা সম্প্রসারণ থেকে তাদের রক্ষা করতে নির্মাণগুলি ("'with' সহ) পালাতে বা উদ্ধৃত হতে পারে।"
ডেভিড কেনেডি

1
আমি সত্যই পড়েছি যে ম্যানুয়াল পৃষ্ঠায় কিন্তু সত্যটি এমন কোনও শেল নেই যা সম্পর্কে আমি অবগত আছি যার জন্য কোঁকড়া ধনুর্বন্ধনী উদ্ধৃত করতে হবে। আপনি কোন শেল ব্যবহার করছেন?
jlliagre

ব্যাশ। উদ্ধৃতি সহ বা ছাড়াই আমি যাইহোক ত্রুটি পাই।
ডেভিড কেনেডি

10

"কাছে অনুপস্থিত যুক্তি -exec" এর অর্থ হ'ল যুক্তি - execএর সমাপ্তিটি অনুপস্থিত। টারমিনেটর পারেন শুধু অক্ষর ধারণকারী একটি আর্গুমেন্ট হতে হবে ;(যা একটি শেল কমান্ড উদ্ধৃত করা প্রয়োজন, তাই এটি সাধারণত লেখা \;বা ';'), অথবা দুই ধারাবাহিক আর্গুমেন্ট ধারণকারী {}এবং +

স্টিফেন চেজেলাস সনাক্ত করেছে যে আপনি জিএনইউর একটি পুরানো সংস্করণ ব্যবহার করছেন যা -exec … {} +কেবল সমর্থন করে না -exec {} \;। যদিও জিএনইউ দেরীতে গ্রহণকারী ছিল -exec … {} +, আমি আপনাকে সুপারিশ করছি যে আপনি কম অ্যান্টিক সরঞ্জাম স্যুট পাবেন (যেমন সাইগউইন , যার মধ্যে গিট এবং আরও অনেক কিছু রয়েছে, বা জিএনইউউইন 32 , যাতে গিটের অভাব রয়েছে তবে খারাপ কর্মচারী চেষ্টা করছে না) -তে-ব্যবহার-লিনাক্স-তবে-উই-উইন্ডো ভিবে যা সাইগউইন দেয়)। এই বৈশিষ্ট্যটি 9 বছর পূর্বে 4.2.12 সংস্করণে যুক্ত করা হয়েছিল (এটি জিএনইউ findপসিক্স-কমপ্লায়েন্ট করতে সর্বশেষ চিহ্নিত বৈশিষ্ট্য ছিল )।

আপনি একটি পুরোনো গনুহ এটি বিদ্ধ করতে চান তাহলে, আপনি ব্যবহার করতে পারেন -print0সঙ্গে xargs -0একটি অনুরূপ কার্যকারিতা পেতে: দলবদ্ধ কমান্ড সঞ্চালনের, নির্বিচারে ফাইলের নাম সমর্থনকারী।

find a/folder b/folder -name '*.c' -o -name '*.h' -print0 | xargs -0 grep -I foobar /dev/null

সর্বদা findকমান্ড লাইনের ওয়াইল্ডকার্ডগুলি উদ্ধৃত করুন । অন্যথায়, আপনি যদি .cফাইলটি সম্বলিত ডিরেক্টরি থেকে এই কমান্ডটি চালিত হন , তবে অচিরাচরিত বর্তমান ডিরেক্টরিতে ফাইলের *.cতালিকায় প্রসারিত হবে .c

যোগ করার পদ্ধতি /dev/nullথেকে grepকমান্ড লাইন যে, grep সবসময় ফাইলের নাম প্রিন্ট হবে তা নিশ্চিত করার জন্য একটি কৌতুক, এমনকি যদি হয় findএকটি একক মিল খুঁজে ঘটবে। জিএনইউ ফাইন্ডের সাথে আরেকটি পদ্ধতি হ'ল বিকল্পটি পাস করা -H


1
সাইগউইন যে-খারাপ-কর্মচারী-ব্যবহার-ব্যবহার-লিনাক্স-তবে-আমরা-চাপিয়ে দেওয়া উইন্ডোগুলি দিয়েছি তার অর্থ কী?
ডেভিড কেনেডি

জিএনইউউইন 32 এর প্রত্যাশা নেই :(
ডেভিড কেনেডি

প্রশ্নের উপর আমার মন্তব্য (গুলি) দেখুন।
জি-ম্যান

অর্ধেকের কাছাকাছি উদ্ধৃতিগুলি একটি প্যাকেজ.জসন স্ক্রিপ্টের মধ্যে থেকে কাজ করেছে।
বিভিজে

2

যদি একটি কমান্ড যেমন

find a/folder b/folder -name "*.c" -o -name "*.h" -exec grep -I foobar {} +

ফেরত ত্রুটি

find: missing argument to -exec

সম্ভাব্য কারণটি খুব পুরানো জিএনইউ findযা সিনট্যাক্স সমর্থন করে না -exec mycommand {} +-exec mycommand {} \;সেক্ষেত্রে স্বল্প পারফরম্যান্স প্রতিস্থাপনটি চালানো হয় যা mycommandএকাধিক লক্ষ্যমাত্রা সংগ্রহ এবং mycommandঠিক একবারে চালানোর পরিবর্তে প্রতিটি পাওয়া লক্ষ্যমাত্রার জন্য একবার চালায় ।

তবে, জিএনইউ findযেমন সমর্থন করে না

find . -type f -and -name "*.ttf" -exec cp {} ~/.fonts +

কারণ জিএনইউ আরও জেনেরিকের পরিবর্তে findকেবল আক্ষরিক সংমিশ্রণকে সমর্থন করে । নোট করুন এবং ধনুর্বন্ধনী এবং চরিত্রের মধ্যে কিছুই থাকতে পারে না । আপনি যদি এটি চেষ্টা করেন তবে আপনি একই ত্রুটি পাবেন:{} +{} additional parameters ++

find: missing argument to -exec

{} additional parameters \;কর্মক্ষেত্রটি সিনট্যাক্স ব্যবহার করা যা কাজ করে তবে প্রতিটি পাওয়া লক্ষ্যমাত্রার জন্য একবার কমান্ডটি কার্যকর করে। GNU- এর সাথে আপনার আরও কর্মক্ষমতা প্রয়োজন হলে আপনাকে findএকটি র‌্যাপার স্ক্রিপ্ট লিখতে হবে যা প্রদত্ত যুক্তিগুলিতে অতিরিক্ত পরামিতি যুক্ত করতে পারে। কিছুটা এইরকম

#!/bin/bash
exec mycommand "$@" additional parameters

যথেষ্ট ভাল হওয়া উচিত। অথবা, আপনি যদি অস্থায়ী ফাইল তৈরি করতে না চান তবে আপনি এই জাতীয় প্যারামিটারের ক্রম পরিবর্তন করতে ওয়ান-লাইনার ব্যবহার করতে পারেন:

find . -type f -and -name "*.ttf" -exec bash -c 'mycommand "$@" extra arguments' {} +

যা কার্যকর করবে mycommand {list of ttf files} extra arguments। নোট করুন যে -cপতাকার পরে আপনার বাশার জন্য বিশেষ অক্ষরগুলি দ্বিগুণ করতে হবে ।


(1) উপরের অংশটি যা আসলে প্রশ্নের উত্তর দেয় অন্য ব্যক্তিরা ইতিমধ্যে দিয়েছিলেন। (২) আপনি যা বর্ণনা করছেন তা জিএনইউতে কোনও ত্রুটি বা ঘাটতি findনয়, তবে পসিক্স দ্বারা নির্দিষ্ট করা সঠিক আচরণ ।
জি-ম্যান

1
+1 শেষ পর্যন্ত, অতিরিক্ত প্যারামিটারগুলি কেন কাজ করে না এমন উত্তর দেয় কেউ! এটি পসিক্স সংজ্ঞাতে অভাবের মতো বলে মনে হচ্ছে।
জোনাথন

আপনি জিএনইউ থাকলে findসম্ভবত জিএনইউ পেয়েছেন cp। এই ক্ষেত্রে আপনি কার্যকর করতে find ... -exec cp --target-directory ~/.fonts {} +পারেন {}স্ট্রিং শেষে।
রোয়াইমা

1

find . -type f -perm 0777 -exec chmod 644 {}\;

পেয়েছিলাম ত্রুটি find: missing argument to ``-exec'

এর মধ্যে স্থান যুক্ত করা {}এবং \এটি স্থির করা:

find . -type f -perm 0777 -print -exec chmod 644 {} \;


1
findকমান্ডটিতে হাতে থাকা প্রশ্নে এ জাতীয় কোনও সমস্যা নেই ।
কুসালানন্দ

প্রশ্নে এটি ঠিক নয়, আমি বুঝতে পেরেছি, তবে সমস্যাটি একই "সন্ধান করুন: missing ex -Eecec" "এর পক্ষে অনুপস্থিত যুক্তি, বিভিন্ন -2 কারণে সমস্যা হতে পারে, আমি উত্তর দিয়েছি কারণ আমি একই সমস্যার বিবৃতি দেখেছি।
শ্রীপুল

@ কুসালানন্দ দুঃখের বিষয়, এই নুব রিপোর্ট করা ত্রুটির জন্য একটি সমাধান দিয়েছে যা প্রশ্নের শিরোনাম এবং শরীরে উভয়ই ওপি জানিয়েছে।
বিভিজে

@bvj প্রশ্ন স্পষ্টভাবে সঙ্গে পুলিশ +আকারে -execকরার অপশন find। এই উত্তরটি এমন একটি সমস্যা সংশোধন করছে যা ব্যবহারকারী প্রশ্ন জিজ্ঞাসা করে না।
কুসালানন্দ

-1

অতীতে এক্সিকিউট সিনট্যাক্সের সাথে আমার মাথাব্যথার অংশ ছিল। বেশিরভাগ দিন এখন আমি ভাল বাশ বাক্য গঠন পছন্দ করি:

for f in `find a/folder b/folder -name "*.[ch]"`; do grep -I foobar $f; done

আপনি যখন গ্রুপগুলি হিসাবে ফাইলগুলি আচরণ করতে চান তখন এর কিছু সীমাবদ্ধতা রয়েছে যেমন প্রতিটির ক্রমিক মূল্যায়ন করা হয় তবে আপনি অন্য কোনও জায়গায় আউটপুটটি পাইপ করতে পারেন


1
যদিও এটি কাজ করতে ঝুঁকির সাথে খাঁটি সন্ধানী সংস্করণের তুলনায় এটি উল্লেখযোগ্যভাবে কম দরকারী কারণ এটি নামটিতে সাদা অংশ সহ সঠিকভাবে ফাইল পরিচালনা করতে পারে না।
ইটান রিজনার

5
না, এটা করবেন না। ফাইলগুলিতে স্পেস এবং অন্যান্য "অদ্ভুত" অক্ষর যুক্ত হওয়ার সাথে সাথে এটি বিরতি দেয়। এটি এর চেয়েও জটিল এবং ধীরতর find … -exec … \;, সুতরাং আপনার ফাইলের নামগুলি জালিয়াতিপূর্ণ থাকলেও এটি ব্যবহার করার কোনও কারণ নেই।
গিলস 'অশুভ হওয়া বন্ধ করুন'

এটি আমার পরিস্থিতির জন্য সহায়ক যেখানে ফাইলের নামের উপর ভিত্তি করে যুক্তিগুলির একাধিক লাইন চালানো দরকার (যেমন চরগুলি সরিয়ে ফেলা, ডিরেক্টরি তৈরি করা এবং ফাইলগুলি সরানো)। একসাথে একাধিক জিনিস করার সন্ধান করা চেষ্টা করা execআমার পক্ষে 5 মিনিটের জন্য ব্যয় করতে চেয়েছিল তার জন্য খুব মাথা ব্যাথা ছিল। আমার ফাইলের নামগুলি ছিল
কৃত্রিম
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.