যেগুলির নামে স্পেস এবং কোট রয়েছে সেই ফাইলগুলি অনুলিপি করতে আমি কীভাবে xargs ব্যবহার করতে পারি?


232

আমি একটি ডিরেক্টরি নীচে একটি গুচ্ছ ফাইলগুলি অনুলিপি করার চেষ্টা করছি এবং বেশিরভাগ ফাইলের নামে ফাঁকা স্থান এবং একক-কোট রয়েছে। আমি স্ট্রিং একসঙ্গে চেষ্টা যখন findএবং grepসঙ্গে xargs, আমি নিম্নলিখিত ত্রুটির পাবেন:

find .|grep "FooBar"|xargs -I{} cp "{}" ~/foo/bar
xargs: unterminated quote

এক্সার্গসের আরও শক্তিশালী ব্যবহারের জন্য কোনও পরামর্শ?

এটি বিএসডি সহ ম্যাক ওএস এক্স 10.5.3 (চিতাবাঘ) এ রয়েছে xargs


2
এটির জন্য জিএনইউ xargs ত্রুটি বার্তাটি একটি একক উদ্ধৃতিযুক্ত ফাইলের নাম সহ আরও সহায়ক: "xargs: তুলনামূলক একক উদ্ধৃতি; আপনি -0 বিকল্পটি ব্যবহার না করে ডিফল্ট উদ্ধৃতিগুলি xargs জন্য বিশেষ"।
স্টিভ জেসোপ

3
জিএনইউ xargs এরও --delimiterবিকল্প রয়েছে ( -d)। \nডিলিমিটার হিসাবে এটি ব্যবহার করে দেখুন , এটি xargsশব্দের সাথে যুক্ত / যুক্তিগুলিতে ফাঁকা ফাঁকা রেখাগুলি পৃথক করা থেকে বিরত রাখে।
ম্যাটবিয়ানকো

উত্তর:


199

আপনি এগুলি সমস্তকে একটি একক findকমান্ডের সাথে সংযুক্ত করতে পারেন :

find . -iname "*foobar*" -exec cp -- "{}" ~/foo/bar \;

এটি ফাইলের নাম এবং ডিরেক্টরিগুলিতে ফাঁকা স্থান সহ পরিচালনা করবে। আপনি -nameকেস-সংবেদনশীল ফলাফল পেতে ব্যবহার করতে পারেন ।

দ্রষ্টব্য: বিকল্পটি হিসাবে শুরু হওয়া ফাইলগুলি প্রক্রিয়াজাতকরণ থেকে আটকাতে --পতাকাটি পাস করেছে ।cp-


70
লোকেরা xargs ব্যবহার করে কারণ সাধারণত প্রতিটি বারে একটি যুক্তি দিয়ে 1000 বার কল করার চেয়ে প্রতিবার 200 টি যুক্তি সহ নির্বাহযোগ্যকে 5 বার কল করা দ্রুত হয় faster
tzot

12
ক্রিস জেস্টার-ইয়ংয়ের উত্তরটি অবশ্যই সেখানে "ভাল উত্তর" হওয়া উচিত ... বিটিডব্লিউ এই সমাধানটি যদি কোনও ফাইলের নাম "-" দিয়ে শুরু হয় তবে কাজ করে না। কমপক্ষে, এটি সিপির পরে "-" প্রয়োজন।
কেলটিয়া

11
গতির উদাহরণ - 829 টিরও বেশি ফাইল, "ফাইন্ড-এক্সেক" পদ্ধতিটি 26 সেকেন্ড সময় নিয়েছে যখন "ফাইন্ড -প্রিন্ট 0 | xargs --null" পদ্ধতি সরঞ্জাম 0.7 সেকেন্ডে। উল্লেখযোগ্য পার্থক্য.
পিটার পোর্টার

7
@tzot দেরিতে মন্তব্য করা তবে যাইহোক, xargsআপনি যে সমস্যার বর্ণনা দিচ্ছেন তা সমাধান করার প্রয়োজন নেই, findইতিমধ্যে এটি -exec +বিরামচিহ্নের সাথে সমর্থন করে ।
jlliagre

3
স্থানগুলি কীভাবে মোকাবেলা করবেন সে প্রশ্নের উত্তর দেয় না
বেন গ্লাসার

117

find . -print0 | grep --null 'FooBar' | xargs -0 ...

চিতাবাঘের উপর সমর্থন grepকরে --null, না সমর্থন করে কিনা সে সম্পর্কে আমি জানি না , তবে জিএনইউ-র পক্ষে এটি বেশ ভাল।xargs-0


1
চিতাবাঘ "-Z" (এটি জিএনইউ গ্রেপ) সমর্থন করে এবং অবশ্যই (1) এবং xargs (1) "-0" সমর্থন করে।
কেলটিয়া

1
ওএস এক্স 10.9 এর grep -{z|Z}অর্থ "zgrep হিসাবে আচরণ করুন" (ডিকম্প্রেস) এবং উদ্দেশ্যটি "প্রতিটি ফাইলের নাম পরে শূন্য বাইট মুদ্রণ" নয়। grep --nullপরেরটি অর্জনের জন্য ব্যবহার করুন ।
বাসিম

4
এর সাথে কী হয়েছে find . -name 'FooBar' -print0 | xargs -0 ...?
কোয়ান্টিন প্রদেট

1
স্পষ্টতই, "FooBar" এর মতো নির্দিষ্ট স্ট্রিংয়ের জন্য, -nameবা ঠিকঠাক -pathকাজ করুন @ কুইন্টিনপ্রেডেট । ওপি grepসম্ভবত এটির ব্যবহার নির্দিষ্ট করে দিয়েছে কারণ তারা নিয়মিত এক্সপ্রেশন ব্যবহার করে তালিকাটি ফিল্টার করতে চায়।
ক্রিস জেস্টার-ইয়ং

1
@ হাই-অ্যাঞ্জেল ঠিক সেই কারণেই আমি xargs -0 এর সাথে মিল রেখে ব্যবহার করি find -print0। পরেরটি NUL টার্মিনেটর সহ ফাইলের নাম মুদ্রণ করে এবং প্রাক্তন সেভাবে ফাইলগুলি গ্রহণ করে। কেন? ইউনিক্সের ফাইলের নামগুলিতে নিউলাইন অক্ষর থাকতে পারে। তবে এগুলিতে NUL অক্ষর থাকতে পারে না।
ক্রিস জেস্টার-ইয়ং

92

আসল পোস্টার যা চায় তার করার সহজতম উপায় হ'ল যে কোনও সাদা স্থান থেকে ডিলিমিটারটি ঠিক এর মতো শেষ-লাইন চরিত্রটিতে পরিবর্তন করা:

find whatever ... | xargs -d "\n" cp -t /var/tmp

4
এই আনসারটি সহজ, কার্যকর এবং সোজা বিন্দুতে: xargs এর জন্য ডিফল্ট ডিলিমিটার সেটটি খুব বিস্তৃত এবং ওপি যা করতে চায় তার জন্য সংকীর্ণ করা দরকার। আমি এই প্রথম হাতটি জানি কারণ আজ আমি এই একই একই ইস্যুতে ছুটে এসেছি সাইগউইন বাদে একই রকম কিছু করে। আমি যদি xargs কমান্ডের জন্য সহায়তাটি পড়তাম তবে আমি কয়েকটা মাথাব্যথা এড়াতে পারি তবে আপনার সমাধানটি আমার জন্য এটি স্থির করে। ধন্যবাদ! (হ্যাঁ, ওপি বিএসডি এক্সার্গস ব্যবহার করে ম্যাকোএসে ছিল, যা আমি ব্যবহার করি না, তবে আমার কাছে আশা আছে যে সমস্ত সংস্করণে xargs "-d" প্যারামিটার বিদ্যমান রয়েছে)।
এটিয়েন ডেলাভেনাট

7
উত্তম উত্তর কিন্তু ম্যাকের কাজ করছে না। এর পরিবর্তে আমরা নল করতে পারেন খোঁজ মধ্যে sed -e 's_\(.*\)_"\1"_g'ফাইলের নাম প্রায় বল কোট করার
ishahak

10
এটি গ্রহণযোগ্য উত্তর হওয়া উচিত। প্রশ্নটি ব্যবহার সম্পর্কে ছিল xargs
মোহাম্মদ আলহশশ

2
আমি পেয়েছিxargs: illegal option -- d
নেহেম

1
এটি উল্লেখ করার মতো যে ফাইলনামগুলিতে অনেকগুলি * নিক্স সিস্টেমে একটি নতুন লাইন অক্ষর থাকতে পারে। আপনি বুনো মধ্যে এটি কখনও চালিত হওয়ার সম্ভাবনা কম তবে আপনি যদি অবিশ্বস্ত ইনপুটটিতে শেল কমান্ডগুলি চালাচ্ছেন তবে এটি উদ্বেগের কারণ হতে পারে।
সোরেন বর্জনস্টাড

71

এটি আরও কার্যকর কারণ এটি একাধিকবার "সিপি" চালায় না:

find -name '*FooBar*' -print0 | xargs -0 cp -t ~/foo/bar

1
এটি আমার পক্ষে কাজ করে না। এটি সিপি ~ / ফু / বারে যা কিছু খুঁজে পাবে তার চেষ্টা করেছিল, তবে তার বিপরীতে নয়
শেরভিন আসগরী

13
সিপি-তে ফ্ল্যাটটি একটি জিএনইউ এক্সটেনশন, আফাইক এবং এটি ওএস এক্সে উপলভ্য নয় But তবে এটি যদি হয় তবে এটি উত্তরটিতে প্রদর্শিত হিসাবে কাজ করবে।
মেটামেট

2
আমি লিনাক্স ব্যবহার করছি। '-টি' স্যুইচের জন্য ধন্যবাদ। এটাই আমি অনুপস্থিত ছিল :-)
ওয়াহিদ পজিরান্দেহ

59

আমি একই সমস্যা মধ্যে দৌড়ে। আমি কীভাবে এটি সমাধান করেছি তা এখানে:

find . -name '*FoooBar*' | sed 's/.*/"&"/' | xargs cp ~/foo/bar

আমি sedপ্রতিটি লাইনের ইনপুট একই লাইনের সাথে প্রতিস্থাপন করতাম, তবে ডাবল উদ্ধৃতি দ্বারা ঘিরে ছিলাম । থেকে sedman পৃষ্ঠা, " ... একটি এম্পারসেন্ড (` `& '') প্রতিস্থাপন প্রদর্শনে পুনরায়- ... মিলে স্ট্রিং দ্বারা প্রতিস্থাপিত হয় এই ক্ষেত্রে, -" .*, সমগ্র লাইন।

এটি xargs: unterminated quoteত্রুটি সমাধান করে ।


3
আমি উইন্ডোতে এবং gnuwin32 ব্যবহার করছি, তাই আমাকে ব্যবহার করতে হয়েছিল sed s/.*/\"&\"/ এটি কাজ করতে
প্যাট

হ্যাঁ তবে সম্ভবত এগুলি ফাইলের নামগুলি হ্যান্ডেল করতে পারে "না - যদি না সেড কোটও উদ্ধৃত করে?
আর্টফুল্রবট

ব্যবহার sedহ'ল প্রতিভা এবং সমস্যার জন্য পুনরায় লিখন না দিয়ে এখনই সঠিক সমাধান!
entonio

53

এই পদ্ধতিটি ম্যাক ওএস এক্স ভি 10.7.5 (সিংহ) এ কাজ করে:

find . | grep FooBar | xargs -I{} cp {} ~/foo/bar

আপনার পোস্ট করা ঠিক সিনট্যাক্সটিও পরীক্ষা করেছিলাম। এটি 10.7.5-তেও দুর্দান্ত কাজ করেছে worked


4
এটি কাজ করে, তবে -Iবোঝায় -L 1(তাই ম্যানুয়ালটি বলে), যার অর্থ সিপি কমান্ড ফাইল = ভি ধীর প্রতি একবার চালানো হচ্ছে।
আর্টফুল্রবট

xargs -J% cp% <গন্তব্য dir> ওএসএক্সে সম্ভবত আরও দক্ষ।
ওয়াকার ডি

3
দুঃখিত, তবে এটি ভুল। প্রথমে এটি ঠিক ত্রুটিটি এড়াতে চেয়েছিল produces আপনাকে অবশ্যই ব্যবহার করতে হবে find ... -print0এবং xargs -0অর্ডার জার্গার্সের জন্য "ডিফল্ট উদ্ধৃতিগুলি বিশেষ" " দ্বিতীয়ত, ফাঁকা স্থান এবং বিশেষ অক্ষরের বিরুদ্ধে সুরক্ষার জন্য সাধারণত xargs এ দেওয়া আদেশগুলি ব্যবহার করবেন '{}'না {}
Andreas Spindler

3
দুঃখিত আন্দ্রেয়াস স্পিন্ডলার, আমি জার্গজের সাথে তেমন পরিচিত নই এবং কিছু পরীক্ষার পরে এই লাইনটি খুঁজে পেয়েছি। এটি বেশিরভাগ লোকের পক্ষে কাজ করে বলে মনে হচ্ছে যারা এটিতে মন্তব্য করেছেন এবং এটির উন্নতি করেছেন। এটি কী ধরণের ত্রুটি সৃষ্টি করে সে সম্পর্কে কিছুটা বিশদে যাওয়ার মধ্যে আপনার কি মনে হবে? এছাড়াও, আপনি যে সঠিক ইনপুটটিকে আরও সঠিক বলে মনে করেন তা পোস্ট করার বিষয়ে কি আপত্তি আছে? ধন্যবাদ.
the_minated

12

শুধু ব্যবহার করবেন না xargs। এটি একটি ঝরঝরে প্রোগ্রাম তবে এটি ভাল হয় নাfind অ-তুচ্ছ মামলার মুখোমুখি হওয়ার সাথে ।

এখানে একটি পোর্টেবল (পসআইএক্স) সমাধান রয়েছে, যার একটি প্রয়োজন নেই find, xargsবা cpজিএনইউ নির্দিষ্ট এক্সটেনশনগুলি:

find . -name "*FooBar*" -exec sh -c 'cp -- "$@" ~/foo/bar' sh {} +

+আরও স্বাভাবিকের পরিবর্তে শেষটি নোট করুন;

এই সমাধান:

  • এম্বেড করা স্পেস, নিউলাইনস বা যাই হোক না কেন বহিরাগত অক্ষরগুলির সাথে ফাইল এবং ডিরেক্টরিগুলি সঠিকভাবে পরিচালনা করে।

  • যে কোনও ইউনিক্স এবং লিনাক্স সিস্টেমে কাজ করে এমনকি জিএনইউ টুলকিট সরবরাহ করে না।

  • xargsএকটি দুর্দান্ত এবং দরকারী প্রোগ্রাম যা ব্যবহার করে না , তবে findআউটপুট সঠিকভাবে পরিচালনা করতে খুব বেশি টুইট এবং অ মানক বৈশিষ্ট্য প্রয়োজন ।

  • এছাড়াও আরও দক্ষ (পড়া দ্রুত ) তুলনায় গ্রহণ করেন এবং যদি সব অন্যান্য উত্তর না অধিকাংশ।

আরও মনে রাখবেন যে অন্য কিছু জবাব বা মন্তব্যে উদ্ধৃতিতে যা বলা হয়েছে তা সত্ত্বেও {}অকেজো (যদি আপনি বহিরাগত fishশেল ব্যবহার না করেন )।



1
@ পিটারমোরটেনসেন আপনি সম্ভবত শেষের দিকটি উপেক্ষা করবেন। কোনও ওভারহেড ছাড়াই findযা করতে পারে xargs
jlliagre

8

Xargs এর জন্য --null কমান্ডলাইন বিকল্পটি সন্ধানের -Print0 বিকল্পের সাহায্যে ব্যবহার করুন।



6
find | perl -lne 'print quotemeta' | xargs ls -d

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


কোনও ফাইলনামে লাইন-ফিড থাকা কি সম্ভব? কখনো শুনি নি.
mtk

2
অবশ্যই এটা. চেষ্টা করুন, উদাহরণস্বরূপ,mkdir test && cd test && perl -e 'open $fh, ">", "this-file-contains-a-\n-here"' && ls | od -tx1
mavit

1
|perl -lne 'print quotemeta'ঠিক আমি যা খুঁজছিলাম এখানে অন্যান্য পোস্টগুলি আমাকে সহায়তা করেনি কারণ কেবলমাত্র ম্যালওয়্যার-সংক্রামিত পিএইচপি ফাইলের সংখ্যা হ্রাস করার findজন্য আমার প্রয়োজনের চেয়ে বেশি grep -rl
মার্কোস

পার্ল এবং কোটমেটা প্রিন্ট 0 / -0 এর চেয়ে অনেক বেশি সাধারণ - স্পেস সহ ফাইলগুলি পাইপলাইনের সাধারণ সমাধানের জন্য ধন্যবাদ

5

আমি খুঁজে পেয়েছি যে নিম্নলিখিত সিনট্যাক্সটি আমার পক্ষে ভাল কাজ করে।

find /usr/pcapps/ -mount -type f -size +1000000c | perl -lpe ' s{ }{\\ }g ' | xargs ls -l | sort +4nr | head -200

এই উদাহরণ হিসাবে, আমি "/ usr / pcapps" এ মাউন্ট করা ফাইল সিস্টেমের মধ্যে 1000,000 বাইটেরও বেশি 200 ফাইল সন্ধান করছি।

"ফাইন্ড" এবং "xargs" এর মধ্যে পার্ল লাইন-লাইনার প্রতিটি ফাঁকা ফাঁকা স্থান থেকে বেরিয়ে যায় / উদ্ধৃত করে তাই "xargs" এম্বেডড ফাঁকা থাকা কোনও ফাইলের নামকে একটি যুক্তি হিসাবে "ls" এ পাস করে।


3

ফ্রেম চ্যালেঞ্জ - আপনি কীভাবে xargs ব্যবহার করবেন তা জিজ্ঞাসা করছেন। উত্তরটি হ'ল: আপনি xargs ব্যবহার করবেন না, কারণ আপনার এটির দরকার নেই।

মন্তব্যuser80168 একটি উপায় বর্ণনা প্রত্যেক ফাইলের জন্য CP কলিং ছাড়া CP সাথে সরাসরি এই কাজ করতে:

find . -name '*FooBar*' -exec cp -t /tmp -- {} +

এটি কাজ করে কারণ:

  • cp -tপতাকা শুরুতে কাছাকাছি গন্তব্যের ডিরেক্টরি দিতে পারবেন cpবরং শেষ কাছাকাছি তুলনায়। থেকে man cp:
   -t, --target-directory=DIRECTORY
         copy all SOURCE arguments into DIRECTORY
  • --পতাকা বলে cpএকটি ফাইল, না একটি পতাকা পর সবকিছু ব্যাখ্যা করা, তাই দিয়ে শুরু ফাইলগুলিতে -বা --বিভ্রান্ত করবেন না cp; আপনার এখনও এটি প্রয়োজন কারণ -/ --অক্ষরগুলি দ্বারা ব্যাখ্যা করা হয় cp, অন্য কোনও বিশেষ অক্ষর শেল দ্বারা ব্যাখ্যা করা হয়।

  • find -exec command {} +বৈকল্পিক মূলত xargs হিসাবে একই নয়। থেকে man find:

   -exec command {} +                                                     
         This  variant  of the -exec action runs the specified command on
         the selected files, but the command line is built  by  appending
         each  selected file name at the end; the total number of invoca‐
         matched  files.   The command line is built in much the same way
         that xargs builds its command lines.  Only one instance of  `{}'
         is  allowed  within the command, and (when find is being invoked
         from a shell) it should be quoted (for example, '{}') to protect
         it  from  interpretation  by shells.  The command is executed in
         the starting directory.  If any invocation  returns  a  non-zero
         value  as exit status, then find returns a non-zero exit status.
         If find encounters an error, this can sometimes cause an immedi‐
         ate  exit, so some pending commands may not be run at all.  This
         variant of -exec always returns true.

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


আশ্চর্যজনক সন্ধান, আমার কোনও ধারণা ছিল না !!! "-Eecec ইউটিলিটি [আর্গুমেন্ট ...] {} + -exec হিসাবে একই, except` {} '' যতটা সম্ভব প্রতিটি পথের অনুরোধের জন্য যথাসম্ভব পথের নাম দ্বারা প্রতিস্থাপন করা হয় This এই আচরণটি xargs এর সাথে সমান (1 )। " বিএসডি বাস্তবায়নে।
সংযোগ

2

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

আমি xargs এর আচরণটিও খুঁজে পাই যার মাধ্যমে এটি কমপক্ষে একবার কমান্ডটি চালায়, এমনকি কোনও ইনপুট না দিয়েও উপদ্রব হতে চলেছে।

নামগুলির ফাঁকা জায়গাগুলির সমস্যাগুলি মোকাবেলায় আমি xargs (xargl) এর নিজস্ব ব্যক্তিগত সংস্করণ লিখেছি (কেবল নতুন লাইনগুলি পৃথক - যদিও 'সন্ধান ... -প্রিন্ট 0' এবং 'xargs -0' সংমিশ্রণটি ফাইলের নামগুলি না পারলে খুব ঝরঝরে রয়েছে) ASCII NUL '\ 0' অক্ষর ধারণ করে My


2
গিটহাব বা এটি ঘটেনি
কোরি গোল্ডবার্গ ২

@ কোরি গোল্ডবার্গ: আমি অনুমান করি যে তখন তা হয়নি।
জোনাথন লেফলার

পসিক্সের প্রথম স্থানে findপ্রয়োজন নেই xargs(এবং এটি 11 বছর আগে ইতিমধ্যে সত্য ছিল)।
jlliagre

2

বাশের সাথে (পসিক্স নয়) আপনি চলকের অভ্যন্তরে বর্তমান লাইনটি পেতে প্রক্রিয়া বিকল্প ব্যবহার করতে পারেন। এটি আপনাকে বিশেষ অক্ষরগুলি থেকে বাঁচতে উদ্ধৃতিগুলি ব্যবহার করতে সক্ষম করে:

while read line ; do cp "$line" ~/bar ; done < <(find . | grep foo)

2

আমার জন্য, আমি কিছু অন্যরকম করার চেষ্টা করছিলাম। আমি আমার টেক্সট ফোল্ডারে আমার .txt ফাইলগুলি অনুলিপি করতে চেয়েছিলাম। .Txt ফাইলের নামগুলিতে স্পেস এবং অ্যাডোস্ট্রোফ অক্ষর রয়েছে। এটি আমার ম্যাকটিতে কাজ করেছে।

$ find . -type f -name '*.txt' | sed 's/'"'"'/\'"'"'/g' | sed 's/.*/"&"/'  | xargs -I{} cp -v {} ./tmp/

1

যদি আপনার সিস্টেমে সংস্করণগুলি সন্ধান করে এবং xarg সংস্করণগুলি সমর্থন করে না -print0এবং -0স্যুইচ না করে (উদাহরণস্বরূপ AIX সন্ধান এবং xargs) আপনি এই ভয়ঙ্কর সন্ধানকারী কোডটি ব্যবহার করতে পারেন:

 find . -name "*foo*" | sed -e "s/'/\\\'/g" -e 's/"/\\"/g' -e 's/ /\\ /g' | xargs cp /your/dest

এখানে সেড এক্সার্গসের জন্য ফাঁকা স্থান এবং উদ্ধৃতিগুলি রক্ষা করার যত্ন নেবে।

এআইএক্স 5.3 এ পরীক্ষিত


1

আমি "xargsL" এর কাছাকাছি "xargsL" নামে একটি ছোট পোর্টেবল র‍্যাপার স্ক্রিপ্ট তৈরি করেছি যা বেশিরভাগ সমস্যার সমাধান করে।

Xargs এর বিপরীতে, xargsL প্রতি লাইনে একটি প্যাথনাম গ্রহণ করে। পথের নামগুলিতে (স্পষ্টতই) নিউলাইন বা NUL বাইট বাদে কোনও অক্ষর থাকতে পারে।

ফাইল তালিকায় কোনও উদ্ধৃতি অনুমোদিত বা সমর্থিত নয় - আপনার ফাইলের নামগুলিতে সমস্ত ধরণের সাদা জায়গা, ব্যাকস্ল্যাশ, ব্যাকটিক্স, শেল ওয়াইল্ডকার্ড অক্ষর থাকতে পারে এবং xargsL এগুলিকে আক্ষরিক অক্ষর হিসাবে প্রক্রিয়া করবে, কোনও ক্ষতি হয়নি।

একটি যুক্ত বোনাস বৈশিষ্ট্য হিসাবে, xargsL করবে না একবার কমান্ড চালাবে !

পার্থক্যটি দ্রষ্টব্য:

$ true | xargs echo no data
no data

$ true | xargsL echo no data # No output

XargsL এ প্রদত্ত যে কোনও যুক্তি xargs এর মাধ্যমে দেওয়া হবে।

এখানে "xargsL" POSIX শেল স্ক্রিপ্টটি রয়েছে:

#! /bin/sh
# Line-based version of "xargs" (one pathname per line which may contain any
# amount of whitespace except for newlines) with the added bonus feature that
# it will not execute the command if the input file is empty.
#
# Version 2018.76.3
#
# Copyright (c) 2018 Guenther Brunthaler. All rights reserved.
#
# This script is free software.
# Distribution is permitted under the terms of the GPLv3.

set -e
trap 'test $? = 0 || echo "$0 failed!" >& 2' 0

if IFS= read -r first
then
        {
                printf '%s\n' "$first"
                cat
        } | sed 's/./\\&/g' | xargs ${1+"$@"}
fi

স্ক্রিপ্টটি আপনার $ PATH তে কিছু ডিরেক্টরিতে রেখে দিন এবং ভুলে যাবেন না

$ chmod +x xargsL

স্ক্রিপ্ট এটি কার্যকর করার জন্য।


1

এম্বেড করা নতুন লাইনের জন্য বিল_ স্টারারের পার্ল সংস্করণ ভালভাবে কাজ করবে না (কেবলমাত্র ফাঁকা স্থানের কপিগুলি )। উদাহরণস্বরূপ সোলারিসের যেখানে আপনার জিএনইউ সরঞ্জাম নেই, তাদের জন্য আরও একটি সম্পূর্ণ সংস্করণ হতে পারে (সেড ব্যবহার করে) ...

find -type f | sed 's/./\\&/g' | xargs grep string_to_find

আপনার প্রয়োজন মতো ফাইন্ড এবং গ্রেপ আর্গুমেন্ট বা অন্যান্য কমান্ডগুলি সামঞ্জস্য করুন, তবে সেড আপনার এমবেড করা নিউলাইন / স্পেস / ট্যাবগুলি ঠিক করবে।


1

সোলারিসে আমি বিল স্টারের উত্তরটি সামান্য পরিবর্তিতভাবে ব্যবহার করেছি :

find . -mtime +2 | perl -pe 's{^}{\"};s{$}{\"}' > ~/output.file

এটি প্রতিটি লাইনের চারপাশে উদ্ধৃতি দেবে। আমি '-l' বিকল্পটি ব্যবহার করি নি যদিও এটি সম্ভবত সহায়তা করবে।

আমি যে ফাইল তালিকাটি যাচ্ছিলাম সেগুলিতে '-' থাকতে পারে তবে নতুন লাইন নয়। আমি অন্য কোনও কমান্ডের সাথে আউটপুট ফাইলটি ব্যবহার করি নি কারণ আমি xargs এর মাধ্যমে কেবলমাত্র তাদের ব্যাপকভাবে মুছতে শুরু করার আগে যা পাওয়া গিয়েছিল তা পর্যালোচনা করতে চাই।


1

আমি এটির সাথে কিছুটা খেলেছি, xargs সংশোধন করার বিষয়ে চিন্তাভাবনা শুরু করেছি এবং বুঝতে পেরেছিলাম যে আমরা এখানে যে ধরনের ব্যবহারের ক্ষেত্রে কথা বলছি, পাইথনের একটি সাধারণ পুনর্নির্মাণ আরও ভাল ধারণা।

একটি জিনিসের জন্য, পুরো জিনিসের জন্য ~ 80 লাইন কোডের অর্থ কী হচ্ছে তা নির্ধারণ করা সহজ, এবং যদি বিভিন্ন আচরণের প্রয়োজন হয় তবে আপনি এটি পেতে কম সময়েই এটি একটি নতুন স্ক্রিপ্টে হ্যাক করতে পারেন can স্ট্যাক ওভারফ্লোয়ের মতো কোথাও একটি উত্তর।

দেখুন https://github.com/johnallsup/jda-misc-scripts/blob/master/yargs এবং https://github.com/johnallsup/jda-misc-scripts/blob/master/zargs.py

ইয়ার্গস হিসাবে লিখিত হিসাবে (এবং পাইথন 3 ইনস্টল করা) আপনি টাইপ করতে পারেন:

find .|grep "FooBar"|yargs -l 203 cp --after ~/foo/bar

একবারে 203 ফাইলের অনুলিপি করতে। (এখানে 203 অবশ্যই একটি স্থানধারক, অবশ্যই, এবং 203 এর মতো একটি অদ্ভুত সংখ্যা ব্যবহার করা স্পষ্ট করে দেয় যে এই সংখ্যাটির অন্য কোনও তাত্পর্য নেই))

আপনি যদি সত্যই দ্রুত এবং পাইথনের প্রয়োজন ছাড়াই কিছু করতে চান তবে জার্গস এবং ইয়ার্গসকে প্রোটোটাইপ হিসাবে গ্রহণ করুন এবং সি ++ বা সিতে পুনর্লিখন করুন


0

আপনার যেমন ফুবার ডিরেক্টরিটি গ্রেপ করার দরকার হতে পারে:

find . -name "file.ext"| grep "FooBar" | xargs -i cp -p "{}" .

1
ম্যান পেজ অনুসারে, -iঅবচয় করা হয়েছে এবং -Iপরিবর্তে ব্যবহার করা উচিত।
একিউম্যানাস

-1

আপনি যদি ব্যাশ ব্যবহার করে থাকেন তবে আপনি স্টডআউটকে লাইনের একটি অ্যারে রূপান্তর করতে পারবেন mapfile:

find . | grep "FooBar" | (mapfile -t; cp "${MAPFILE[@]}" ~/foobar)

সুবিধাগুলি হ'ল:

  • এটি অন্তর্নির্মিত, তাই এটি দ্রুত।
  • একবারে সমস্ত ফাইলের নাম দিয়ে কমান্ডটি কার্যকর করুন, তাই এটি আরও দ্রুত।
  • আপনি ফাইলের নামগুলিতে অন্যান্য যুক্তি যুক্ত করতে পারেন। কারণ cp, আপনি এগুলিও করতে পারেন:

    find . -name '*FooBar*' -exec cp -t ~/foobar -- {} +
    

    তবে কিছু কমান্ডের এমন বৈশিষ্ট্য নেই।

অসুবিধাগুলি:

  • যদি খুব বেশি ফাইলের নাম থাকে তবে ভাল স্কেল না করে। (সীমা? আমি জানি না, তবে আমি 10 এমবি তালিকা ফাইলের সাথে পরীক্ষা করেছিলাম যার মধ্যে 10000+ ফাইলের নাম অন্তর্ভুক্ত রয়েছে, কোনও সমস্যা নেই, ডিবিয়ান এর অধীনে)

আচ্ছা ... বাশ ওএস এক্স এ পাওয়া যায় কিনা কে জানে?

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