কীভাবে 'find' এর সাথে 'tar' কমান্ড একত্রিত করবেন


31

ফাইন্ড কমান্ড এই আউটপুট দেয়:

[রুট @ লোকালহোস্ট /] # বার / লগ / -নাম অ্যানাকোন্ডা সন্ধান করুন *
Var / log /? anaconda.log
Var / log /? anaconda.xlog
Var / log /? anaconda.yum.log
Var / log /? anaconda.syslog
Var / log /? anaconda.program.log
Var / log /? anaconda.storage.log

টারের সাথে সংযুক্ত হওয়ার পরে এটি এই আউটপুটটি দেখাচ্ছে:

[রুট @ লোকালহোস্ট /] # খুঁজে বের করুন লর / লগ / -নাম অ্যানাকোন্ডা।
Var / log /? anaconda.log
Var / log /? anaconda.xlog
Var / log /? anaconda.yum.log
Var / log /? anaconda.syslog
Var / log /? anaconda.program.log
Var / log /? anaconda.storage.log

কিন্তু টার ফাইল তালিকাভুক্ত করার সময় এটি কেবল একটি একক ফাইল দেখায়

[রুট @ লোকালহোস্ট /] # টিআর-টিটিভিএফ ফাইল.্টার
-আরড ------- মূল / মূল 208454 2012-02-27 12:01 ভের / লগ / অ্যানাকোন্ডা.স্টোরেজ.লগ

আমি এখানে কি ভুল করছি?

Xargs সহ আমি এই আউটপুটটি পাচ্ছি:

[রুট @ লোকালহোস্ট /] # বার / লগ / -নাম অ্যানাকোন্ডা সন্ধান করুন * xargs tar -cvf file1.tar

দ্বিতীয় প্রশ্ন

ভারের সামনে / টাইপ করার সময় , এর অর্থ find /var/logএই কেনা মেটােজটি দেওয়া হচ্ছে : সদস্যের নাম থেকে নেতৃস্থানীয় `/ 'সরানো হচ্ছে

[রুট @ লোকালহোস্ট /] # সন্ধান করুন / ভের / লগ / -নাম অ্যানাকোন্ডা *
টার: সদস্যের নাম থেকে নেতৃস্থানীয় `/ 'সরানো
/var/log/anaconda.log
টার: সদস্যের নাম থেকে নেতৃস্থানীয় `/ 'সরানো
/var/log/anaconda.xlog
টার: সদস্যের নাম থেকে নেতৃস্থানীয় `/ 'সরানো
/var/log/anaconda.yum.log
টার: সদস্যের নাম থেকে নেতৃস্থানীয় `/ 'সরানো
/var/log/anaconda.syslog
টার: সদস্যের নাম থেকে নেতৃস্থানীয় `/ 'সরানো
/var/log/anaconda.program.log
টার: সদস্যের নাম থেকে নেতৃস্থানীয় `/ 'সরানো
/var/log/anaconda.storage.log

একটি সাধারণ আকারে নিম্নলিখিত দুটি মধ্যে পার্থক্য কি?

find var/log এবং find /var/log


এটি আধা + অফ অফ টপিক, তবে findকমান্ডটি নিয়ে এগিয়ে গেলে আপনার অনুসন্ধান শব্দটি উদ্ধৃত করা উচিত। এটি কখনও কখনও ছাড়াই কাজ করে তবে সর্বদা না।
নার্ডওয়ালার

1
আপনি যদি এর {} +পরিবর্তে ব্যবহার {} \;করেন তবে একটি যুক্তিতে অনুসন্ধানের ফলাফলগুলি গোষ্ঠীভুক্ত করবে
জেসন এস

উত্তর:


39

নোট: দেখুন @ আয়ান এর উত্তর একটি কিছুটা আরও দক্ষ সমাধান জন্য।

নোট যে এটি খুঁজে পাওয়া প্রতিটি ফাইলের জন্য অ্যাকশন findকল করবে Note-exec

আপনি যদি tar -cvf file.tar {}প্রতিটি একক ফাইল findআউটপুটগুলির জন্য দৌড়ে থাকেন তবে এর অর্থ হ'ল আপনি file.tarপ্রতিবার ওভাররাইট করে ফেলবেন, যা আপনাকে কেবলমাত্র একটি সংরক্ষণাগার দিয়েই কেন শেষ করবে তা ব্যাখ্যা করে anaconda.storage.log- এটি শেষ ফাইলের findআউটপুট।

এখন, আপনি প্রকৃতপক্ষে প্রতিটি সময় ফাইল তৈরির পরিবর্তে সংরক্ষণাগারে ফাইলগুলি যুক্ত করতে চান ( -cবিকল্পটি এটি করে। সুতরাং, নিম্নলিখিত ব্যবহার করুন:

find var/log/ -iname "anaconda.*" -exec tar -rvf file.tar {} \;

-rবিকল্প পরিবর্তে এটি প্রত্যেক সময় পুনরায় নির্মাণের সংরক্ষণাগার appends।

দ্রষ্টব্য: প্রতিস্থাপন -iname anaconda.*সঙ্গে -iname "anaconda.*"। তারকাচিহ্নটি একটি ওয়াইল্ডকার্ড এবং এমনকি এটি দেখার আগে আপনার শেলটি দ্বারা এটি প্রসারিত করা যেতে পারে find। এই প্রসারণ রোধ করতে, যুক্তিটিকে ডাবল কোটে মুড়ে দিন।


tarশীর্ষস্থানীয় অপসারণ হিসাবে /: সংরক্ষণাগারে কেবল আপেক্ষিক ফাইলের নাম থাকা উচিত । যদি আপনি একটি নেতৃস্থানীয় ফাইল যুক্ত করেন তবে /এগুলি নিখুঁত ফাইলের নাম হিসাবে /var/…আপনার কম্পিউটারে আক্ষরিক অর্থ হিসাবে সংরক্ষণ করা হবে for

আইআইআরসি tarএটি জিএনইউ ব্যতীত অন্য বাস্তবায়নের জন্য কেবল একটি সাবধানতা এবং এটি এইভাবে নিরাপদ কারণ আপনি /var/…যখন সংরক্ষণাগারটি বের করেন তখন আপনার প্রকৃত ডেটা ওভাররাইট করতে পারবেন না যদি এতে আপেক্ষিক ফাইলের নাম থাকে।


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

2
সত্য, তবে আমি মনে করি আমরা নিরাপদে এই পরিস্থিতিটিকে উপেক্ষা করতে পারি;)
15

@ এসএলএইচএইচকে * একটি ওয়াইল্ডকার্ড যা সমস্ত সম্ভাবনার সাথে মিলে যায়? কিন্তু এখানে find /var/log/ -iname anaconda*কিছুই find /var/log/ -iname anaconda.*দিচ্ছেনা এবং আউটপুট দিচ্ছেন কেন?
সর্বোচ্চ

যখন কোনও ওয়াইল্ডকার্ড গ্রাস হয়ে যায়, এটি findআর দেখা হবে না । সুতরাং আপনার যদি থাকে anaconda*এবং আপনার বর্তমান ফোল্ডারে এমন কিছু নাম দেওয়া হয়েছে, উদাহরণস্বরূপ, anaconda5(এই ওয়াইল্ডকার্ডের সাথে মিলে), ওয়াইল্ডকার্ডটি প্রসারিত findহবে এবং -iname anaconda5পরিবর্তে এটি দেখতে পাবে -iname anaconda*। প্রথমটি কেন কাজ করে না এবং দ্বিতীয়টি আপনার বর্তমান ডিরেক্টরিতে ফাইলগুলি নির্ভর করে on @ ম্যাক্স
স্ল্যাক করুন

2
আপনি তার {} +পরিবর্তে ব্যবহার করতে পারেন {} \;সুতরাং এটির ফলাফলগুলির ফলাফলকে একটি যুক্তিতে অনুসন্ধান করবে
জেসন এস

41

আপনি এর মতো কিছু ব্যবহার করতে পারেন:

find var/log -iname 'anaconda.*' -print0 | tar -cvf somefile.tar --null -T -

-print0এবং -Tএকসঙ্গে কাজ করতে স্পেস নতুন লাইন, ইত্যাদি সঙ্গে ফাইলের নামের করার অনুমতি চূড়ান্ত -আলকাতরা বলে stdin থেকে ইনপুট ফাইলের নামের পড়তে।

লক্ষ্য করুন -print0আপনার বিবৃতি শেষে আসতে হবে, প্রতি এই উত্তর । অন্যথায় আপনি সম্ভবত আপনার প্রত্যাশার চেয়ে বেশি ফাইল পাবেন।


2
পুরো -nameবিকল্পটিতে আপনার সমাধানটির কারণ হিসাবে আপনি বিকল্পটি বাদ দিয়েছেন tar। যদি আপনি এটি চান তবে আপনি tar -cvf file.tar var/logএটি ব্যবহার না করেই আরও সহজেই করতে পারেন find
নিকোল হ্যামিল্টন

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

2
আপনি ইতিমধ্যে আপনার +1 পেয়েছেন। খুশী থেকো. :) দীর্ঘ কমান্ড লাইনগুলি সর্বদা কোনও ওএস এ প্রক্রিয়া তৈরির জন্য নিষেধ থাকে। আমার মনে আছে 90 এর দশকের গোড়ার দিকে মাইক্রোসফ্টে মার্ক লুকোভস্কির সাথে বিতর্ক করা হয়েছিল যে এনটি-তে তাদের 32 কে ইউনিকোড চরিত্রের সীমা খুব ছোট ছিল এবং তার অভিযোগ করানোর পরে আমার কোনও ধারণা ছিল না যে কার্নেলের সর্বত্র শর্টসের চেয়ে দীর্ঘতর দৈর্ঘ্য সংরক্ষণ করতে আরও কত বাইট লাগবে । দীর্ঘশ্বাস. যখন আরগের তালিকাটি দীর্ঘ হয় তখন সর্বাধিক সাধারণ সমাধানগুলি শেলটিতে আরও বেশি করণীয় হয় (যদি সম্ভব হয়; খনিতে এটি হয়) বা ব্যবহার করতে হয় xargs
নিকোল হ্যামিল্টন

9
যদি আপনি -print0সন্ধানের বিকল্পটি ব্যবহার করেন তবে আপনারও টারের --nullবিকল্প প্রয়োজন ।
mivk

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

12

এটা চেষ্টা কর:

tar -cvf file.tar `find var/log/ -iname "anaconda.*"`

আপনি ব্যবহার findকরার চেষ্টা করছেন -exec tar-execবিকল্পটি যেভাবে কাজ করে, এটি প্রতিবার খুঁজে পাওয়া প্রতিটি মিলে যাওয়া ফাইলের জন্য একবারে এই কমান্ডটি চালায়, যার ফলে tarপ্রতিবার উত্পাদিত টার ফাইলটি ওভাররাইট হয়ে যায়। এজন্য আপনি কেবল সর্বশেষটি দিয়ে শেষ করেছেন। এছাড়াও, আপনি যে ধরণটি নির্দিষ্ট করেছেন findসেটির চারপাশে আপনার উদ্ধৃতি স্থাপন করা দরকার যাতে শেলটি পাস করার আগে এটি প্রসারিত না হয় find

ব্যাকটিক্স সহ কমান্ড প্রতিস্থাপন ব্যবহার করা (বা $(...)আপনি যদি পছন্দ করেন তবে স্বরলিপি ব্যবহার করে ), উত্পাদিত নামের পুরো তালিকাটি findকমান্ড লাইনে আর্গুমেন্ট হিসাবে আটকানো হয় tar, যার ফলে এটি একবারে সমস্ত লিখতে সক্ষম হয়।


2
এটির পরিণতি খারাপ হতে পারে যদি তাদের নাম, নিউলাইনগুলি বা গ্লোব্বিং অক্ষরগুলির ফাঁকা ফাঁকা ফাইলগুলি খুঁজে বের করে। এটি ব্যর্থ হতে বাধ্য - স্টপআউট থেকে পাইপিং findকরা খুব কমই ভাল ধারণা। mywiki.wooledge.org/ParsingLs
slhck

3
@ এসএলএইচএইচকি, সন্ধান থেকে পাইপিং স্টাডাউটটি আসলে একটি ভাল ধারণা যা আপনার মন্তব্যে লিঙ্ক করা পৃষ্ঠায় খুব স্পষ্টভাবে ব্যাখ্যা করা হয়েছে :)। এটি আসলে জিনিসগুলি করার প্রস্তাবিত উপায়। আপনি শুধু (যেমন কিছু কৌশল ব্যবহার করা উচিত read -rএর -print0) আমি আমার উত্তর করেনি।
টেরডন

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

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

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

6

প্রশ্ন 1

আপনার কমান্ড ব্যর্থ হয়েছে কারণ tarপাওয়া ফাইলগুলির প্রত্যেকটি নিচ্ছে এবং সেগুলিকে সংরক্ষণাগারভুক্ত করছে file.tar। প্রতিবার এটি এটি করে, এটি পূর্বে নির্মিত তৈরি ওভাররাইট করবে file.tar

আপনি যা চান তা যদি সমস্ত ফাইলের সাথে একটি সংরক্ষণাগার হয় তবে tarসরাসরি সরাসরি চালান , কোনও প্রয়োজন নেই find(এবং হ্যাঁ, এটি ফাইলগুলির জন্য তাদের নামের ফাঁকা স্থানের জন্য কাজ করে):

tar -vcf file.tar /var/log/anaconda*   

প্রশ্ন 2

দুটি কমান্ড সম্পূর্ণ পৃথক:

  • var / log সন্ধান করে এমন একটি ডিরেক্টরি অনুসন্ধান করবে var/log যা আপনার বর্তমান ডিরেক্টরিটির একটি উপ-ডিরেক্টরি যা এটি find ./var/log(নোটিশটি দেখুন ./) সমতুল্য ।

  • / var / লগ অনুসন্ধানের জন্য একটি ডিরেক্টরি অনুসন্ধান করবে /var/log যা মূলটির একটি উপ-ডিরেক্টরি/

নেতৃস্থানীয় /বার্তাটি এসেছে tar, না find। এর অর্থ এই যে আপেক্ষিক পথে নিখুঁত পাথ /তৈরি করতে এটি আপনার ফাইলের প্রথম নামটি সরিয়ে দিচ্ছে । এর অর্থ হ'ল আপনি যখন সংরক্ষণাগারটি অনুরুপ করবেন তখন ফাইলটি থেকে বের করা হবে ।/var/log/anaconda.error./var/log/anaconda.error


1

দুটি উপায় -execকাজ করতে পারে। একটি উপায় কমান্ডটি বহুবার চালায় - প্রতিটি ফাইলের জন্য একবার; প্যারামিটারগুলির তালিকা হিসাবে সমস্ত ফাইল সহ অন্য উপায়ে একবার কমান্ড চালায়।

  • -exec tar -cvf file.tar {} ';'tarপ্রতিটি ফাইলের জন্য কমান্ড চালায় , প্রতিটি সময় সংরক্ষণাগারটি ওভাররাইট করে।
  • -exec tar -cvf file.tar {} '+'tarপাওয়া সমস্ত ফাইলের একটি সংরক্ষণাগার তৈরি করে একবার কমান্ড চালায় ।

1

আমার মনে হয় আপনার কাছে প্রচুর ফাইল থাকলে প্রতিটি ফাইলের জন্য -exec ব্যবহার করে টার সংক্ষেপনটি খুব ধীর হয়ে যায়। আমি কমান্ডটি পছন্দ করি:

find . -iname "*.jpg" | cpio -ov -H tar -F jpgs.tar

যতক্ষণ না এটি ব্যর্থ হওয়া শুরু করে/bin/cpio: xxx: Cannot open: Too many open files
SYN
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.