আমি কীভাবে একটি একক ফাইলের সন্ধান করে ফাইলগুলির বিষয়বস্তুগুলি বিড়াল করতে পারি?


11

মূল্যবান ডেটা ধারণ করে এমন একটি পার্টিশন পুনরায় ফর্ম্যাট করে আমি যেখানে নিজেকে ব্যাথা দেয় (সত্যিই খারাপ) তা আমি পরিচালনা করেছিলাম। অবশ্যই এটি উদ্দেশ্যমূলক ছিল না, তবে এটি ঘটেছে।

তবে আমি বেশিরভাগ ডেটা ব্যবহার করতে testdiskএবং photorecপুনরুদ্ধার করতে সক্ষম হয়েছি । সুতরাং এখন আমি প্রায় 25,000 ডিরেক্টরিতে বিতরণ করেছি যে সমস্ত তথ্য। বেশিরভাগ ফাইল হ'ল .txt ফাইল, এবং বাকিগুলি চিত্র ফাইল। প্রতিটি ডিরেক্টরিতে 300 টিরও বেশি টেক্সট ফাইল রয়েছে।

.Txt ফাইলগুলি থেকে নির্দিষ্ট স্ট্রিংগুলি বের করতে এবং সেগুলি একটি ফাইলে আউটপুট করতে আমি grepবা ব্যবহার findকরতে পারি । উদাহরণস্বরূপ, এখানে একটি লাইন যা আমি যাচাই করতে ব্যবহার করেছি যে আমার ডেটা পুনরুদ্ধার করা ফাইলগুলিতে রয়েছে:

find ./recup*/ -name '*.txt' -print | xargs grep -i "searchPattern"

আমি কোনও ফাইলে "সার্চপ্যাটার্ন" আউটপুট দিতে পারি, তবে এটি আমাকে সেই প্যাটার্নটি দেয়। আমি এখানে যা করতে চাই তা এখানে:

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

আমি মনে করি এটি করণীয়, তবে আমি কোনও ফাইলের সমস্ত বিষয়বস্তু থেকে কোনও নির্দিষ্ট প্যাটার্নটি গ্রেপ করার পরে কীভাবে তা দখল করব তা আমি জানি না।


সুতরাং আপনি যে কমান্ডটি সরবরাহ করেছেন তাতে এটি আপনাকে ফলাফলগুলি দেয় যা আপনি সন্ধান করছেন তবে আপনি আউটপুটটিকে কোনও পাঠ্য ফাইলে পুনর্নির্দেশ করতে চান?
রাইকায়ো

আমার প্রশ্নটি পড়ার পরে, সেই অনুচ্ছেদটি যা "দিয়ে যান ..." দিয়ে শুরু হয় ঠিক সেউইডোকোডের মতো শোনাচ্ছে। পাইথন কোডের জন্য / যদি কয়েক লাইনের সাথে আমি কোডটি পেতে পারি। আমি আরও বর্ধিত প্রতিক্রিয়ার
Ami

এটি অবশ্যই স্যুইচোডকোড, এবং আমি নিশ্চিত যে এটির জন্য আপনিও কোনও উপায় খুঁজে পেতে পারেন।
রাইকায়ো

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

আপনি সম্ভবত কমান্ডটি কোনওরকমভাবে বিবৃতি বা এমনকি একটি স্যুইচ-
কেসটি लपेट

উত্তর:


10

আমি যদি আপনার লক্ষ্যটি সঠিকভাবে বুঝতে পারি তবে নীচেরগুলি আপনি যা চান তা করবে:

find ./recup*/ -name '*.txt' -exec grep -qi "searchPattern" {} \; -exec cat {} \; > outputfile.txt

এটি এতে সমস্ত *.txtফাইল সন্ধান করবে ./recup*/, প্রত্যেকটির জন্য searchPatternএটি পরীক্ষা করবে , এটি যদি catফাইলের সাথে মেলে তবে । সমস্ত catএড ফাইলের আউটপুটটি নির্দেশিত হবে outputfile.txt

প্রতিটি প্যাটার্ন এবং আউটপুট ফাইলের জন্য পুনরাবৃত্তি করুন।


আপনার যদি ডিরেক্টরিগুলির একটি খুব বড় সংখ্যক মিল থাকে তবে ./recup*আপনি এ দিয়ে শেষ হতে পারেন argument list too long error। এর চারপাশের সহজ উপায় হ'ল পরিবর্তে এরকম কিছু করা:

find ./ -mindepth 2 -path './recup*.txt' -exec grep -qi "searchPattern" {} \; -exec cat {} \; > outputfile.txt

এটি পুরো পথের সাথে মিলবে। তাই ./recup01234/foo/bar.txtমিলবে। -mindepth 2যাতে এটি মেলে করা হবে না ./recup.txt, বা ./recup0.txt


হ্যাঁ, আমি মনে করি এটি এটি করবে। এবং এটি আমাকে কাজ করার জন্য একটি বেস দেয়। যেহেতু আমি একাধিক স্ট্রিং সন্ধান করতে যাচ্ছি, আমি মনে করি একাধিক এলিফ সহ একটি কোড / যদি বিট কোড আমাকে টাস্কটি স্বয়ংক্রিয় করতে সহায়তা করবে। আপনাকে ধন্যবাদ
Ami

আমি যা ভাবছিলাম তার চেয়েও বেশি ভালো
রাইকায়ো

কাজ করে বলে মনে হচ্ছে না। এই ত্রুটিটি পেয়েছেন: "কার্যকর করতে / usr / বিন / সন্ধান করতে অক্ষম: আর্গুমেন্ট তালিকাটি দীর্ঘ দীর্ঘ"
অমি

এই সমস্যার সমাধান দেওয়ার জন্য @ আমি আপডেট করেছেন
প্যাট্রিক

2
@ আমি আপনি যদি একাধিক স্ট্রিং ব্যবহার করে থাকেন তবে কেবলমাত্র সমস্ত ইতিবাচক ফাইলের নাম অন্য কোনও ফাইল ( grep -l) এ সংরক্ষণ করা সহজ হবে , তারপরে |sort|uniqএবং catফাইল তালিকা থেকে।
স্পারহাক

3

আপনার প্যাটার্নটি আউটপুট করার পরিবর্তে, গ্রেপ-এ "-l" ব্যবহার করে ফাইলের নাম আউটপুট করুন এবং তারপরে এটি বিড়ালের ইনপুট হিসাবে ব্যবহার করুন।

find ./recup*/ -name '*.txt' -print | xargs grep -li "searchPattern" | xargs cat

অথবা

cat $( find ./recup*/ -name '*.txt' -print | xargs grep -li "searchPattern")

আমি সন্দেহ করি যে আপনি অবশিষ্ট বিশদটি পূরণ করতে পারেন। বিটিডাব্লু, আপনার যদি ফাইলের নামগুলিতে ফাঁকা জায়গা বা অন্যান্য বিজোড় অক্ষর থাকতে পারে (এই নির্দিষ্ট ক্ষেত্রে অসম্ভব, তবে ভবিষ্যতের উদ্দেশ্যে), এক্স-জার্গসের ব্যবহারের জন্য -0 বিকল্পের সাথে মিলিয়ে-গ্রেপের উপর -Z-এর প্রিন্ট 0 ব্যবহার করুন নতুন লাইনের পরিবর্তে ফাইলের নামগুলির মধ্যে নাল বাইট

find ./recup*/ -name '*.txt' -print0 | xargs -0 grep -Zli "searchPattern" | xargs -0 cat

2
আমি প্যাট্রিকের "দ্বি-এক্সেক" বিকল্পটিও পছন্দ করি, এটি বাদে এটি একটি নতুন কাঁটাচামচ (ভাল, ক্লোন ()) তৈরি করে এবং প্রতিটি ফাইলের জন্য নির্বাহ করে। সাধারণত আপনি সমস্যাটি এড়াতে \+চেয়ে ব্যবহার করতে পারেন \;, তবে আমি জানি না যে এটি কীভাবে একজোড়া আর্গ (একটি "দুর্বল" বলে সন্দেহ করে) এর সাথে কাজ করে। একজোড়া xargs ব্যবহার করে, আপনি কেবল কয়েকটি নতুন প্রক্রিয়া তৈরি করতে যাচ্ছেন যা প্রচুর ফাইলের সাথে দ্রুত হওয়া উচিত।
dannysauer

এটিও বেশ সুন্দর দেখাচ্ছে। ধন্যবাদ। একটি ছোট প্রশ্ন: শেষ xargs এর পরে বিড়ালটি কোনও ফাইলে আউটপুট করা উচিত, তাই না?
অমি

আমি যখন প্রথম এটি পড়েছিলাম তখন আমি মনে করি না যে প্রশ্নটি ফাইলের বিষয়বস্তুগুলি কোথায় যেতে হবে specified এই তিনটি কমান্ডই ফাইল (গুলি) এর সামগ্রীগুলি STDOUT এ রেখেছিল, সুতরাং আপনি কেবল (একেবারে শেষের দিকে) >afileবা |acommandআপনার পরিস্থিতির জন্য উপযুক্ত যা কিছু যুক্ত করতে চান । :)
ড্যানিসাউয়ার

ভাল উত্তর, আমার বিড়াল করা দরকার pg_hba.conf sudo find /* -name pg_hba.conf | xargs sudo cat
অ্যাপ্লিকেশন কাজ

এটি সামান্য অফ-টপিক, তবে আমি sudo xargsপরিবর্তে ব্যবহার করা পছন্দ করি xargs sudo। আপনি যখন চালান xargs sudo, এটি কমান্ডটি ধরে নিয়ে কমান্ড লাইন তৈরি করে sudo cat args। তবে বিড়ালটি / বিনে রয়েছে, তাই সুডো চলে /bin/cat args। যদি আপনার কমান্ডটি / usr / স্থানীয় / বিনের মতো কোনও দীর্ঘ ডিরেক্টরিতে থাকে তবে কমান্ড সুডো আসলে চালিত হতে পারে একটি দীর্ঘ-দীর্ঘ কমান্ড লাইন এবং একটি ত্রুটি যা ট্র্যাক করা শক্ত। তার উপরে, sudo xargsআপনি xargs sudoলগইন করুন যে আপনি এক্সার্গস চালিয়েছেন, যখন সমস্ত আর্গুমেন্টের সাহায্যে কমান্ডটি লগ করে - ফলস্বরূপ কিছু দীর্ঘ সুডো লগ লাইন তৈরি করা হয়। :)
ড্যানিসাউয়ার

1

এটি হুবহু সর্বোত্তম কোড নয়, তবে এটি অত্যন্ত সোজা এবং দক্ষতা যদি কোনও সমস্যা না হয় তবে তা কাজ করবে work সমস্যাটি হ'ল এটি ফাইলগুলির মধ্যে একাধিকবার গ্রেপ হবে, এমনকি যদি তার মধ্যে স্ট্রিংটি ইতিমধ্যে পাওয়া যায়।

প্রথমত, আপনার স্ট্রিংগুলি অনুসন্ধান করুন এবং মেলানো ফাইলগুলিকে একটি তালিকায় লিখুন।

find ./recup*/ -name '*.txt' -execdir grep -il "searchPattern" {} >> /tmp/file_list \;

searchPatternপ্রয়োজনীয় পদক্ষেপের পরিবর্তে এই পদক্ষেপটি পুনরাবৃত্তি করুন । এটি এখানে মেলানো ফাইলগুলির একটি তালিকা তৈরি করে /tmp/file_list

সমস্যাটি হ'ল এই ফাইলটির এতে নকল থাকতে পারে। সুতরাং, আমরা এর সাথে সদৃশ প্রতিস্থাপন করতে পারেন |sort|uniqsortঅংশ সদৃশ একে অপরের সাথে সংলগ্ন স্থান, যাতে uniqতাদের সরাতে পারেন। তারপরে আপনি catএই ফাইলগুলি একসাথে xargs(প্রতিটি ফাইলের নাম নতুন লাইনের দ্বারা পৃথক করে \n) ব্যবহার করতে পারেন । তাই,

</tmp/file_list sort | uniq | xargs -d "\n" cat > final_file.txt

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


0

আপনার শেল এবং পরিবেশের উপর নির্ভর করে আপনি এরকম কিছু করতে পারেন (ব্যাশে)

while IFS= read -r -d '' file; do
  if grep -qim1 'searchPattern1\|searchPattern2\|searchPattern3' "$file"; then
    cat "$file" >> some/other/file
  fi
done < <(find ./recup*/ -name '*.txt' -print0)

আপনি যদি প্যাটার্ন অনুসারে ফলাফলগুলি পৃথক করতে চান তবে আপনি এটির মতো পরিবর্তন করতে পারেন

while IFS= read -r -d '' file; do
  if grep -qim1 'searchPattern1' "$file"; then
    cat "$file" >> some/other/file1
  elif grep -qim1 'searchPattern2' "$file"; then
    cat "$file" >> some/other/file2
  elif grep -qim1 'searchPattern3' "$file"; then
    cat "$file" >> some/other/file3
  fi
done < <(find ./recup*/ -name '*.txt' -print0)

"সম্পন্ন" পরে বিট কি করে? আমি আসলে যা পছন্দ করব তা হ'ল এটির সংশোধন করা যাতে কোনও ব্লক করা হয় যাতে মেলানো প্যাটার্নযুক্ত ফাইলগুলি আলাদা আলাদা করে লেখা হয়।
অমি

এটি কেবল '.txt' ফাইলগুলি খুঁজে পাওয়া যায় যা প্রতিটি পাওয়া যায়, প্রতিটি নাল অক্ষর দ্বারা সমাপ্ত হয় (যাতে এটি ফাঁকা এবং অন্যান্য অক্ষরযুক্ত ফাইলের নামগুলির জন্য নিরাপদ থাকে)। whileলুপ তারপর যে তালিকা পড়ে এবং না grep/ শর্তাধীন catঅংশ।
steeldriver

আমি কোডটি চালানোর চেষ্টা করার সময়, আমি এই ত্রুটিটি পেয়েছি: ./recoverData.sh: সিনট্যাক্স ত্রুটি: "(" অপ্রত্যাশিত। এটি ফাইন্ড কমান্ডের চারপাশে বন্ধনী থেকে আসছে
অমি

আপনি কোন শেল ব্যবহার করছেন? প্রক্রিয়া প্রতিস্থাপন বাক্য গঠন বাশ নির্দিষ্ট - সুতরাং আমার যোগ্যতা "আপনার শেল এবং পরিবেশের উপর নির্ভর করে"
স্টিল্ড্রাইভার

1
আপনি হয় সরাসরি ইন্টারেক্টিভ ব্যাশ শেলের মাধ্যমে কমান্ড (গুলি) সম্পাদন #!/bin/bashকরতে পারেন , বা তাদের এমন একটি ফাইলের মধ্যে রাখতে পারেন যার প্রথম লাইনে শেবাং রয়েছে , এটি chmod +x recoverData.shকার্যকর করতে সক্ষম করে এবং এটি ব্যবহার করে কার্যকর করতে পারে ./recoverData.shসম্ভবত শেল হওয়ার কারণে ব্যবহার করবেন নাsh recoverData.sh/bin/shdash
স্টিল্ড্রাইভার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.