কেন -exec mv find find ./target/ + কাজ করে না?


98

আমি ঠিক কি জানতে চান {} \;এবং {} \+এবং | xargs ...না। এগুলি ব্যাখ্যা সহ স্পষ্ট করুন।

3 টি কমান্ডের নীচে চালিত হয় এবং একই ফলাফল আউটপুট হয় তবে প্রথম কমান্ডটি একটু সময় নেয় এবং ফর্ম্যাটটিও কিছুটা আলাদা।

find . -type f -exec file {} \;
find . -type f -exec file {} \+
find . -type f | xargs file

কারণ 1 fileকমান্ড থেকে আসা প্রতিটি ফাইলের জন্য কমান্ড চালায় find। সুতরাং, মূলত:

file file1.txt
file file2.txt

তবে দ্বিতীয়টি -execনীচের মতো সমস্ত ফাইলের জন্য একবার ফাইল কমান্ড চালাতে কমান্ডগুলি সহ সন্ধান করুন:

file file1.txt file2.txt

তারপরে আমি নীচের কমান্ডগুলি চালাচ্ছি যার উপর প্রথম কোনওটি সমস্যা ছাড়াই চলে তবে দ্বিতীয়টি ত্রুটি বার্তা দেয়।

find . -type f -iname '*.cpp' -exec mv {} ./test/ \;
find . -type f -iname '*.cpp' -exec mv {} ./test/ \+ #gives error:find: missing argument to `-exec'

কমান্ডের সাথে {} \+এটি আমাকে ত্রুটি বার্তা দেয়

find: missing argument to `-exec'

এটা কেন? কেউ দয়া করে ব্যাখ্যা করতে পারেন আমি কী ভুল করছি?


আসল প্রশ্নটি সহজ, প্রথমটি কেন কাজ করে এবং দ্বিতীয়টি কেন কাজ করে না? (1) সন্ধান করুন। -type f -iname ' .cpp' -exec mv {/ ./test/ \; (2) সন্ধান করুন। -type f -iname ' .cpp' -exec mv {/ ./test/ \ +
শাহাদাত হোসেন

উত্তর:


186

ম্যানুয়েল পৃষ্ঠা (অথবা অনলাইন গনুহ ম্যানুয়াল ) প্রায় কাছাকাছি সবকিছু ব্যাখ্যা করে।

Find -exec কমান্ড {} \;

প্রতিটি ফলাফলের জন্য, command {}কার্যকর করা হয়। সমস্ত উপস্থিতি {}ফাইলের নাম দ্বারা প্রতিস্থাপন করা হয়। ;শেলটিকে ব্যাখ্যার হাত থেকে বাঁচাতে একটি স্ল্যাশের সাথে উপসর্গযুক্ত।

find -exec কমান্ড {} +

প্রতিটি ফলাফল সংযোজন করা হয় commandএবং তারপরে কার্যকর করা হয়। কমান্ডের দৈর্ঘ্যের সীমাবদ্ধতাগুলি বিবেচনায় নিয়ে আমি অনুমান করি যে ম্যানুয়াল পৃষ্ঠাটি আমাকে সমর্থন করে এই কমান্ডটি আরও একবার কার্যকর করা যেতে পারে:

কমান্ডের অনুরোধের মোট সংখ্যা মিলিত ফাইলগুলির সংখ্যার তুলনায় অনেক কম হবে।

ম্যানুয়াল পৃষ্ঠা থেকে এই উদ্ধৃতিটি নোট করুন:

কমান্ড লাইনটি একইভাবে নির্মিত হয়েছে যেমন xargs তার কমান্ড লাইনগুলি তৈরি করে

এটা কেন কোন অক্ষরের মধ্যে অনুমতি দেওয়া হয় এর {}এবং +হোয়াইটস্পেস ছাড়া। +আর্গুমেন্টগুলি ঠিক একইভাবে কমান্ডে যুক্ত করা উচিত তা সনাক্ত করে xargs

সমাধান

ভাগ্যক্রমে, এর GNU বাস্তবায়ন mvউভয় -tবা দীর্ঘতর পরামিতি সহ টার্গেট ডিরেক্টরিটিকে আর্গুমেন্ট হিসাবে গ্রহণ করতে পারে --target। এর ব্যবহার হবে:

mv -t target file1 file2 ...

আপনার findআদেশটি হয়ে যায়:

find . -type f -iname '*.cpp' -exec mv -t ./test/ {} \+

ম্যানুয়াল পৃষ্ঠা থেকে:

-exec আদেশ;

আদেশ কার্যকর; যদি 0 স্ট্যাটাস ফিরে আসে তবে সত্য To; 'সমন্বিত একটি যুক্তি না পাওয়া পর্যন্ত অনুসন্ধানের জন্য নিম্নলিখিত সমস্ত যুক্তি কমান্ডের পক্ষে যুক্তি হিসাবে নেওয়া হবে; সম্মুখীন হয়। স্ট্রিং `{} 'বর্তমান ফাইলের নাম দ্বারা যেখানেই ব্যবহৃত হয় সেখানেই এটি প্রসেস করা হবে যেখানে এটি কমান্ডের আর্গুমেন্টগুলিতে দেখা যায়, যেখানে এটি একা রয়েছে সেখানে কেবল আর্গুমেন্টে নয় find এই দুটি নির্মাণই শেল দ্বারা সম্প্রসারণ থেকে রক্ষা পেতে (a \ 'দিয়ে) বা উদ্ধৃত হওয়া প্রয়োজন হতে পারে। এক্সেক্স বিকল্পটি ব্যবহারের উদাহরণগুলির জন্য উদাহরণ বিভাগটি দেখুন। নির্দিষ্ট কমান্ডটি প্রতিটি মিলিত ফাইলের জন্য একবার চালানো হয়। কমান্ডটি শুরু ডিরেক্টরিতে কার্যকর করা হয়। অযৌক্তিক অ্যাকশন ব্যবহারের আশেপাশে অনিবার্য সুরক্ষা সমস্যা রয়েছে; পরিবর্তে আপনার -execdir বিকল্পটি ব্যবহার করা উচিত।

-exec কমান্ড {} +

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


4
আমি জানি এটি কীভাবে কাজ করে, আমি এই ম্যানুয়ালটি বেশ কয়েকবার পেরিয়েছি, তবে আমি {} + ব্যবহার করার জন্য ত্রুটি বার্তা পেয়েছি, যদিও {} for এর জন্য কাজ করে; এবং আমি উইন্ডোতে সাইগউইন ব্যবহার করছি।
শাহাদাত হোসেন

4
@ শাহাদাত: আপনি "ম্যানুয়াল পৃষ্ঠা থেকে" এর আগে অংশটি পড়েছেন? আপনি এবং এর ./test/মধ্যে রেখেছেন তবে এগুলির মধ্যে কোনও অ-সাদা অংশের অক্ষর অনুমোদিত নয়। {}+
লেকেনস্টেইন

রু বলছে যে।} এবং + এর মধ্যে আমার। / টেস্ট / রাখা উচিত নয়। তাহলে এমভি কমান্ড কীভাবে কাজ করবে; এমভিতে এমন উত্স প্রয়োজন যা {is এবং গন্তব্য প্রয়োজন যা / আপনি দয়া করে সঠিক আদেশটি লিখতে পারেন?
শাহাদাত হোসেন

@ শাহাদাত: আপনি যা অর্জন করতে চাইছেন তা আমি দেখতে পাচ্ছি। উইন্ডোজ প্রোগ্রামগুলি সম্পাদন করতে ধীর, সুতরাং আপনি এটি একটি কমান্ডের সাথে সংযুক্ত করতে চান। আমি উত্তরের বিকল্প যুক্ত করব।
লেকেনস্টেইন

4
+কমান্ড একটু অদ্ভুত AFAIU যেহেতু এটি "শেষ" ফাইল লাঠি (এবং এর জায়গা হয় না {}) কেন ব্যবহার {}এই বিভ্রান্তিকর - সব হয়। -tআমি যে বিকল্পটির কথা জানতাম না তার জন্য ধন্যবাদ , মনে হয় যে বিকল্পটি সেই -exec +সমস্যার জন্য কার্যকর হিসাবে তৈরি করা হয়েছিল !
e2-e4

6

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

find .* * -maxdepth 0 -not -path '.git' -not -path '.backup' -exec mv '{}' .backup \;

ধনুর্বন্ধনী উদ্ধৃত করার রহস্য ছিল । execকমান্ডের শেষে বন্ধনীগুলির দরকার নেই ।

আমি উবুন্টু 14.04 এর অধীনে পরীক্ষা করেছি ( BASH এবং ZSH শেলসের সাথে ), এটি একইরকম কাজ করে।

যাইহোক, +সাইনটি ব্যবহার করার সময় এটি অবশ্যই execকমান্ডের শেষে থাকতে হবে বলে মনে হয় ।


{}চাহিদা উদ্ধৃত করা fishএবং rcশেল, কিন্তু না এ zsh, bashকিংবা বোর্ন বা csh শেল পরিবারের অন্য কোন শেল।
স্টিফেন চেজেলাস

@ স্টাফেন চ্যাজেলাস ইয়েপ, উবুন্টুর নীচে রিট করেছেন bash, সত্যিই উদ্ধৃতিগুলি প্রয়োজনীয় নয়। কৌতূহলজনকভাবে, ম্যাকওএস (ব্যবহার করে zsh) এর অধীনে সেগুলি উদ্ধৃত না করে থাকলে আমার একটি সমস্যা ছিল । তবে আমার আবার চেষ্টা করার মতো ম্যাক নেই ...
আরভিমেটাল

3

মান সমতুল্য find -iname ... -exec mv -t dest {} +জন্য findবাস্তবায়নের যে সমর্থন করে না -inameবা mvবাস্তবায়নের যে সমর্থন করি না -tপুনরায়-অর্ডার আর্গুমেন্ট করার জন্য একটি শেল ব্যবহার করতে হয়:

find . -name '*.[cC][pP][pP]' -type f -exec sh -c '
  exec mv "$@" /dest/dir/' sh {} +

ব্যবহার করে -name '*.[cC][pP][pP]', আমরা বড় লোকাল cবা এর বড় সংস্করণ কী তা সিদ্ধান্ত নিতে বর্তমান লোকালের উপর নির্ভরতা এড়াতে পারি p

মনে রাখবেন যে +, ;কোনও শেলের বিপরীতে বিশেষ নয় তাই উদ্ধৃত করার দরকার নেই (যদিও উদ্ধৃতিটি ক্ষতি করবে না, অবশ্যই এই জাতীয় শেলগুলি যেমন কোটিং অপারেটর হিসাবে rcসমর্থন করে না \)।

চিহ্ন /মধ্যে /dest/dir/যাতে হয় mvপরিবর্তে পুনঃনামকরনের একজন ত্রুটি সহ ব্যর্থ foo.cppকরার /dest/dirক্ষেত্রে যেখানে শুধুমাত্র এক cppফাইল পাওয়া যায় নি এবং /dest/dirউপস্থিত করেনি বা ডিরেক্টরির (অথবা নির্দেশিকাতে সিমবলিক লিঙ্ক) ছিল না।


কমান্ড কার্যকর করার প্রাথমিক হিসাবে ইন-শেল অপারেশনটি বিভিন্ন ব্যবহারের ক্ষেত্রে কার্যকর ... চমৎকার useful
সিবিহে

0
find . -name "*.mp3" -exec mv --target-directory=/home/d0k/Музика/ {} \+

দয়া করে আপনার উত্তরে এমন কিছু ব্যাখ্যা যুক্ত করুন যাতে অন্যরা এটি থেকে শিখতে পারে
নিকো হায়েস

আপনাকে প্রশ্নের উত্তর দিতে হবে, যা ব্যাখ্যা চেয়েছিল। কোড-কেবল কোনও উত্তর নয়।
লাজোস আরপাদ

-1

না, এর মধ্যে পার্থক্য +এবং \;বিপরীত হবে। +এক্সিকিউট কমান্ডের শেষে ফাইলগুলি সংযোজন করে তার পরে এক্সিকিউট কমান্ড চালায় এবং\; চালায় এবং প্রতিটি ফাইলের জন্য কমান্ড চালায়।

সমস্যা find . -type f -iname '*.cpp' -exec mv {} ./test/ \+হওয়া উচিত find . -type f -iname '*.cpp' -exec mv {} ./test/ + এটা অব্যাহতি বা বিনষ্ট করার কোন প্রয়োজন+

xargs আমি দীর্ঘ সময় ব্যবহার করি নি তবে আমার মনে হয় + এর মতো কাজ করে।


আমি এটি দিয়ে চেষ্টা করেছিলাম কিন্তু একই ত্রুটি বার্তা পেয়েছি। তদুপরি, সর্বত্র আমি কেবলমাত্র + ব্যবহার করতে পেলাম তবে আমার সাইগউইনে আমাকে কাজ করতে \ + বা "+" ব্যবহার করতে হবে।
শাহাদাত হোসেন

ওহ এটি একটি সাইগউইন পরিবেশ। দুঃখিত, তবে আমি জানি না, আমি সাইগউইন শেল ব্যবহার করি না, আমি কেবল একটি * নিক্স ব্যবহার করি।
মাইক রামিরেজ

4
@ শাহাদাত হোসেন চেষ্টা করুন -name "*.cpp"আমি নামটি খুব সহজেই ব্যবহার করতে চাই যতক্ষণ না আমি কিছু مشکل রেইগেক্স অনুসন্ধান করতে চাই, যেমন-নাম '??? কাজ'। * c। সিপিপি '
মাইক রামিরেজ

4
@ মাইক: আমি মনে করি আপনি -inameএবং এর মধ্যে পার্থক্যটি ভুল বুঝেছেন -name-inameএটি কেস-সংবেদনশীল সংস্করণ -nameএবং নিয়মিত প্রকাশগুলি পরিচালনা করতে কোনও পার্থক্য নেই। আমি পোস্ট করার আগে কমান্ড চেষ্টা করার পরামর্শ দিই, আপনার কমান্ডটি আমার শেলটিতেও ব্যর্থ হয়।
লেকেনস্টেইন

4
@ লেকেনস্টেইন এটি ইতিমধ্যে প্রতিষ্ঠিত হয়েছিল যা আপনার মন্তব্যের আগে ঘটনা ছিল। আমি ভেবেছিলাম আপনার পোস্টের আগে আমি শাহাদাতকে স্বীকার করেছি, এটি একটি সাধারণ "ঠিক আছে"। না, আমি এটি ম্যানুয়ালি চালাইনি, আমি এটি আমার মাথার উপরে থেকে করেছি এবং সন্ধানের সাথে রেগেক্স অনুসন্ধানের ফর্মটি খুব কমই ব্যবহার করি। এটি কেবল একটি 'সহায়তা করতে পারে' টাইপ জিনিস।
মাইক রামিরেজ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.