একাধিক ফাইলের বিষয়বস্তু কীভাবে একটি ফাইলে সংযুক্ত করা যায়


174

আমি পাঁচটি ফাইলের বিষয়বস্তু যেমন আছে তেমন একটি ফাইলে অনুলিপি করতে চাই। আমি প্রতিটি ফাইলের জন্য সিপি ব্যবহার করে এটি করার চেষ্টা করেছি। কিন্তু এটি পূর্ববর্তী ফাইল থেকে অনুলিপি করা সামগ্রীগুলি ওভাররাইট করে। আমিও চেষ্টা করেছি

paste -d "\n" 1.txt 0.txt

এবং এটি কার্যকর হয়নি।

আমি চাই আমার স্ক্রিপ্ট প্রতিটি পাঠ্য ফাইলের শেষে নতুন লাইন যুক্ত করুন।

যেমন। ফাইল 1.txt, 2.txt, 3.txt। 0.txt এ 1,2,3 এর সামগ্রী রাখুন

আমি এটা কিভাবে করব ?



এখানে আরও একটি উত্তর: stackoverflow.com/questions/2576693/…
নিকোস সি

উত্তর:


308

আপনার আউটপুট ফাইলে catশেল পুনঃনির্দেশ ( >) সহ আপনার (সংক্ষিপ্তের জন্য সংক্ষিপ্ত) কমান্ডটি প্রয়োজন

cat 1.txt 2.txt 3.txt > 0.txt

8
ঠিক >> হওয়া উচিত? এবং এছাড়াও আমার 0.txt ফাইলের সমস্ত পাঠের আগে একটি নতুন লাইন কেন আছে?
বাষ্প

1
আপনি কি 0.txt এর সামগ্রী সংরক্ষণ করতে চান?
0:03

13
@ ব্লাস্টো এটি নির্ভর করে। আপনি একটি ফাইল অন্যটিতে যুক্ত করতে ব্যবহার >>করবেন , যেখানে আউটপুট ফাইলটিকে এতে যা কিছু নির্দেশিত হয়েছে তা দিয়ে ওভাররাইট করে। নিউলাইন হিসাবে, ফাইলের প্রথম চরিত্র হিসাবে একটি নতুন লাইন আছে ? আপনি ব্যবহার করে এবং প্রথম অক্ষরটি একটি কিনা তা খুঁজে বের করতে পারেন । > 1.txtod -c\n
র‌্যাডিক্যাল 7

1
ধন্যবাদ আসলে, আমার ফাইলগুলি foo_1, foo_2, foo_3 এর মতো। আমি আপনার কোডটি - বিড়াল "$ ফাইলের নাম _" {1,2,3} "। Txt" হিসাবে সংশোধন করার চেষ্টা করেছি, তবে এটি কার্যকর হয়নি।
বাষ্প

1
@ ব্লাস্টো আপনি অবশ্যই সঠিক পথে যাচ্ছেন। বাশ অবশ্যই {...}ফাইলের সাথে মিলের জন্য ফর্মটি গ্রহণ করে , তাই সম্ভবত আপনার স্ক্রিপ্টে উদ্ধৃতিচিহ্নগুলি কিছুটা গণ্ডগোল করেছে? আমি সবসময় lsশেল ব্যবহার করে এই জাতীয় জিনিসগুলির সাথে কাজ করার চেষ্টা করি । যখন আমি কমান্ডটি সঠিকভাবে পেয়েছি, আমি এটি ঠিক তেমন স্ক্রিপ্টে কাটা-এন-পেস্ট করব। আপনি -xআপনার স্ক্রিপ্টগুলিতে বিকল্পটি দরকারীও পেতে পারেন - এটি কার্যকর করার আগে স্ক্রিপ্টে প্রসারিত আদেশগুলি প্রতিধ্বনিত করে।
র‌্যাডিক্যাল 7

97

আপনার মধ্যে যারা এখনও আমার মতো এই পোস্টে হোঁচট খায় তাদের জন্য আরেকটি বিকল্প হ'ল find -exec:

find . -type f -name '*.txt' -exec cat {} + >> output.file

আমার ক্ষেত্রে, আমার আরও শক্তিশালী বিকল্পের প্রয়োজন ছিল যা একাধিক সাব-ডিরেক্টরিতে প্রদর্শিত হবে যাতে আমি ব্যবহার করতে পছন্দ করি find। এটি ভেঙে দেওয়া:

find .

বর্তমান ওয়ার্কিং ডিরেক্টরি মধ্যে দেখুন।

-type f

ডিরেক্টরিগুলিতে নয় কেবল ফাইলগুলিতে আগ্রহী

-name '*.txt'

নাম অনুসারে ফলাফল নির্ধারণ করুন

-exec cat {} +

প্রতিটি ফলাফলের জন্য ক্যাট কমান্ড কার্যকর করুন। "+" এর অর্থ কেবলমাত্র 1 টি উদাহরণ catতৈরি হয়েছে (thx @gniourf_gniourf)

 >> output.file

অন্যান্য উত্তরে বর্ণিত হিসাবে, আউটপুট ফাইলের শেষে ক্যাট-এড বিষয়বস্তু যুক্ত করুন।


10
এই উত্তরে প্রচুর ত্রুটি রয়েছে। প্রথমত, ওয়াইল্ডকার্ডটি *.txtউদ্ধৃত করতে হবে (অন্যথায়, পুরো findকমান্ডটি যেমন লিখিত, অকেজো)। আরও একটি ত্রুটি একটি স্থূল ভুল ধারণা থেকে আসে: যে আদেশটি কার্যকর করা হয় তা নয় cat >> 0.txt {} , কিন্তু cat {}। আপনার আদেশটি বাস্তবে সমান { find . -type f -name *.txt -exec cat '{}' \; ; } >> 0.txt(আমি গ্রুপিং যুক্ত করেছিলাম যাতে আপনি বুঝতে পারেন যে আসলে কী হচ্ছে)। আর একটি ত্রুটি হ'ল findফাইলটি সন্ধান করতে যাচ্ছে 0.txtএবং ইনপুট ফাইল আউটপুট ফাইলcat বলে অভিযোগ করবে ।
gniourf_gniourf

সংশোধনের জন্য ধন্যবাদ। আমার কেসটি কিছুটা আলাদা ছিল এবং আমি এই মামলার প্রয়োগ হিসাবে এমন কিছু গোচাখার কথা ভাবিনি।
mopo922

>> output.fileআপনার কমান্ডের শেষের দিকে আপনার উচিত , যাতে আপনি কাউকে (নিজেকে অন্তর্ভুক্ত) এমন ভাবনায় প্ররোচিত না করেন যা প্রতিটি প্রাপ্ত ফাইলের জন্য findকার্যকর cat {} >> output.fileকরা যায়।
gniourf_gniourf

সত্যিই দেখতে ভাল লাগছে! একটি চূড়ান্ত পরামর্শ: -exec cat {} +পরিবর্তে ব্যবহার করুন -exec cat {} \;, যাতে কেবলমাত্র একটি উদাহরণ catবেশ কয়েকটি যুক্তি দিয়ে তৈরি হয় ( +পসিক্স দ্বারা নির্দিষ্ট করা হয় )।
gniourf_gniourf

3
উত্তম উত্তর এবং সতর্কতার শব্দ - আমি find . -type f -exec cat {} + >> outputfile.txtআমার এটিকে সংশোধন করেছি: ডিরেক্টরিটি কেবল 50 মেগ থাকা সত্ত্বেও কেন আমার আউটপুট ফাইলটি জিগগুলিতে বৃদ্ধি পাবে না তা বুঝতে পারিনি। এর কারণ আমি নিজেই আউটপুটফিল.টিএসটিএস্ট যুক্ত করে রেখেছিলাম! সুতরাং এটিকে এড়াতে কেবল সেই ফাইলটির সঠিক নামকরণ করতে বা এটি অন্য ডিরেক্টরিতে পুরোপুরি স্থাপন করা নিশ্চিত করুন।
Thisisstackoverflow

43

আপনার যদি একটি নির্দিষ্ট আউটপুট টাইপ থাকে তবে এরকম কিছু করুন

cat /path/to/files/*.txt >> finalout.txt

1
মনে রাখবেন যে আপনি যদিও মার্জ অর্ডার বজায় রাখার সম্ভাবনা হারাচ্ছেন। যদি আপনার ফাইলগুলির নাম দেওয়া থাকে তবে এটি আপনাকে প্রভাবিত করতে পারে। file_1,, file_2... file_11, ফাইলগুলি কীভাবে বাছাই করা হয় প্রাকৃতিক আদেশের কারণে।
Emix

16

আপনার সমস্ত ফাইল যদি একক ডিরেক্টরিতে থাকে তবে আপনি কেবল তা করতে পারেন

cat * > 0.txt

ফাইলগুলি 1.txt, 2.txt, .. 0.txt এ যাবে


ইতিমধ্যে Esশ্বর দ্বারা উত্তর। মনে রাখবেন যে আপনি যদিও মার্জ অর্ডার বজায় রাখার সম্ভাবনা হারাচ্ছেন। যদি আপনার ফাইলগুলির নাম দেওয়া থাকে তবে এটি আপনাকে প্রভাবিত করতে পারে। file_1,, file_2... file_11, ফাইলগুলি কীভাবে বাছাই করা হয় প্রাকৃতিক আদেশের কারণে।
এমিক্স

10
for i in {1..3}; do cat "$i.txt" >> 0.txt; done

আমি এই পৃষ্ঠাটি পেয়েছি কারণ আমার একসাথে 952 টি ফাইল যুক্ত হতে হয়েছিল। আপনার অনেকগুলি ফাইল থাকলে আমি এটি আরও ভালভাবে কাজ করতে দেখতে পেয়েছি। এটি আপনার প্রয়োজন এমন অনেক সংখ্যার জন্য একটি লুপ করবে এবং ০.txt এর শেষে যুক্ত হওয়ার জন্য প্রত্যেকের বিড়াল ব্যবহার করবে।


আপনি বিড়াল লিখতে বাশে ব্রেস প্রসারণ ব্যবহার করতে পারেন cat 1,2,3} .txt >> 0.txt
mcheema

9

যদি আপনার সমস্ত ফাইলের নাম একইভাবে দেওয়া হয় তবে আপনি সহজভাবে করতে পারেন:

cat *.log >> output.log

5

আরেকটি বিকল্প হ'ল sed:

sed r 1.txt 2.txt 3.txt > merge.txt 

অথবা ...

sed h 1.txt 2.txt 3.txt > merge.txt 

অথবা ...

sed -n p 1.txt 2.txt 3.txt > merge.txt # -n is mandatory here

বা পুনঃনির্দেশ ছাড়াই ...

sed wmerge.txt 1.txt 2.txt 3.txt

নোট করুন যে শেষ লাইনটিও লিখুন merge.txt(না wmerge.txt!)। আপনি w"merge.txt"ফাইলের নামের সাথে বিভ্রান্তি এড়াতে এবং -nনীরব আউটপুট ব্যবহার করতে পারেন ।

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

sed -n w"merge.txt" {1..3}.txt

4

যদি আপনার ফাইলগুলিতে শিরোনাম থাকে এবং আপনি আউটপুট ফাইলে সেগুলি সরাতে চান তবে আপনি ব্যবহার করতে পারেন:

for f in `ls *.txt`; do sed '2,$!d' $f >> 0.out; done

3

যদি মূল ফাইলটিতে মুদ্রণযোগ্য অক্ষর থাকে তবে বিড়াল কমান্ডটি ব্যবহার করার সময় সেগুলি হারিয়ে যাবে। 'ক্যাট-ভি' ব্যবহার করে, অ-মুদ্রণযোগ্যগুলি দৃশ্যমান অক্ষরের স্ট্রিংগুলিতে রূপান্তরিত হবে তবে আউটপুট ফাইলটিতে এখনও মূল ফাইলটিতে প্রকৃত অ-মুদ্রণযোগ্য অক্ষর থাকবে না। অল্প সংখ্যক ফাইলের সাথে একটি বিকল্প হতে পারে কোনও সম্পাদক (প্রথমত ভিএম) -র প্রথম ফাইলটি খোলার জন্য যা মুদ্রণ-বিহীন অক্ষরগুলি পরিচালনা করে। তারপরে ফাইলটির নীচে কসরত করুন এবং ": r সেকেন্ড_ফাইল_নাম" প্রবেশ করুন। এটি মুদ্রণবিহীন অক্ষরগুলি সহ দ্বিতীয় ফাইলটিতে টানবে। অতিরিক্ত ফাইলগুলির জন্যও এটি করা যেতে পারে। সমস্ত ফাইল পড়তে গেলে, ": w" লিখুন। শেষ ফলাফলটি হ'ল প্রথম ফাইলটিতে এখন এটি যা ছিল মূলত যা ছিল, সেই সাথে ফাইলগুলিতে যা পড়েছিল সেগুলি অন্তর্ভুক্ত থাকবে।


এটি খুব স্ক্রিপ্টযোগ্য নয়।
এফকেইন্টারনেট

1

আপনি যদি একটি ফাইলের মধ্যে 3 টি ফাইলের বিষয়বস্তু যুক্ত করতে চান তবে নীচের কমান্ডটি একটি ভাল পছন্দ হবে:

cat file1 file2 file3 | tee -a file4 > /dev/null

এটি কনসোল আউটপুট নিক্ষেপ করে ফাইল 4-এ সমস্ত ফাইলের বিষয়বস্তু একত্রিত করবে /dev/null

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