একাধিক পাঠ্য ফাইলকে বাশ-এর ​​একক ফাইলে সংযুক্ত করা


305

ডিরেক্টরিতে সমস্ত * .txt ফাইলকে একটি বৃহত পাঠ্য ফাইলে একত্রিত করার দ্রুত এবং সর্বাধিক বাস্তব উপায় কী?

বর্তমানে আমি সাইগউইন সহ উইন্ডোজগুলি ব্যবহার করছি যাতে আমার কাছে BASH এ প্রবেশাধিকার রয়েছে।

উইন্ডোজ শেল কমান্ডটি খুব সুন্দর হবে তবে আমি সন্দেহ করি যে এটির একটি আছে।

উত্তর:


537

এটি আউটপুট all.txt এ যুক্ত করে

cat *.txt >> all.txt

এটি all.txt ওভাররাইট করে

cat *.txt > all.txt

30
আপনি এমন কোনও সমস্যায় পড়তে পারেন যেখানে এটি all.txt কে all.txt এ বিড়াল করে দেয় ... আমার মাঝে মাঝে গ্রেপ নিয়ে সমস্যা হয়, বিড়ালেরও একই আচরণ হয় কিনা তা নিশ্চিত নই।
rmeador

8
@ আরমিডোর হ্যাঁ, এটি সত্য, যদি all.txt ইতিমধ্যে বিদ্যমান থাকে তবে আপনার এই সমস্যা হবে। এই সমস্যাটি একটি আলাদা এক্সটেনশান দিয়ে আউটপুট ফাইল সরবরাহ করে, বা all.txt কে আলাদা ফোল্ডারে স্থানান্তরিত করে সমাধান করা হয়।
রবার্ট গ্রাইনার

2
বিড়াল * .txt >> টিএমপি; এমভি tmp, all.txt (এবং যে all.txt পূর্বেই বিদ্যমান নয় তা নিশ্চিত করুন)
Renaud

16
আমি "আর্গুমেন্টের তালিকা খুব দীর্ঘ" পেয়েছি - অনুমান করুন এটি 40,000+ ফাইল পরিচালনা করতে পারে না।
ম্যাট

32
এর সাথে যুক্তি তালিকা খুব দীর্ঘ echo *.txt | xargs cat > all.txt
এড়াতে

145

কেবল মনে রাখবেন, এখনও অবধি দেওয়া সমস্ত সমাধানের জন্য, শেলটি ক্রমটি সিদ্ধান্ত নিয়েছে যাতে ফাইলগুলি একত্রিত হয়। বাশ, আইআইআরসি-র জন্য এটি বর্ণানুক্রমিক ক্রম। যদি অর্ডারটি গুরুত্বপূর্ণ হয় তবে আপনি ফাইলগুলির যথাযথ নামকরণ করতে হবে (01file.txt, 02file.txt, ইত্যাদি ...) অথবা প্রতিটি ফাইলটি যেভাবে সংহত করতে চান তা নির্দিষ্ট করতে হবে।

$ cat file1 file2 file3 file4 file5 file6 > out.txt

33

উইন্ডোজ শেল কমান্ড এটি typeকরতে পারে:

type *.txt >outputfile

টাইপ typeকমান্ড স্টার্ডারের কাছে ফাইলের নামও লিখে থাকে, যা >পুনর্নির্দেশ অপারেটর দ্বারা ক্যাপচার করা হয় না (তবে কনসোলে প্রদর্শিত হবে)।


2
কেবল সচেতন থাকুন যে আপনি যদি আউটপুট ফাইলটিকে মূল ফাইলের মতো একই ডিরেক্টরিতে রাখেন তবে এটি একটি সদৃশ হয়ে যাবে কারণ এটি নতুন আউটপুট ফাইলটিকেও দু'বার সংযুক্ত করবে।
ক্যাথালএমএফ

26

আপনি উইন্ডোজ শেল copyফাইল যুক্ত করতে ব্যবহার করতে পারেন ।

C:\> copy *.txt outputfile

সহায়তা থেকে:

ফাইল সংযুক্ত করতে গন্তব্যের জন্য একটি একক ফাইল নির্দিষ্ট করুন তবে উত্সের জন্য একাধিক ফাইল (ওয়াইল্ডকার্ড বা ফাইল 1 + ফাইল 2 + ​​ফাইল 3 ফর্ম্যাট ব্যবহার করে)।


এটি প্রাথমিকভাবে কোনও পার্শ্ব প্রতিক্রিয়ার সাথে আইএমএইচও পরিষ্কার সমাধান হিসাবে এটি দুর্ভাগ্যক্রমে দুর্ভাগ্যজনকভাবে ভ্রমণ করতে পারে এমন যথেষ্ট প্রশংসা পায় না :-(
গ্র্যাম্ফএফএমবিএল

ওপি বাশকে জিজ্ঞাসা করলেন।
বড় ধনী

2
প্রশ্ন পড়েছেন? "উইন্ডোজ শেল কমান্ডটিও দুর্দান্ত লাগবে ..."
কার্ল নরম

8

সাবধানতা অবলম্বন করুন, কারণ এগুলির কোনও পদ্ধতিই প্রচুর সংখ্যক ফাইল নিয়ে কাজ করে না। ব্যক্তিগতভাবে, আমি এই লাইনটি ব্যবহার করেছি:

for i in $(ls | grep ".txt");do cat $i >> output.txt;done

সম্পাদনা করুন: যেমন কেউ মন্তব্য বলেন, আপনি প্রতিস্থাপন করতে পারেন $(ls | grep ".txt")সঙ্গে$(ls *.txt)

সম্পাদনা করুন: @gnourf_gnourf দক্ষতার ধন্যবাদ, ব্যবহার উল্লিখিত glob একটি ডিরেক্টরির মধ্যে ফাইল পুনরুক্তি উপর সঠিক উপায়। ফলস্বরূপ, নিন্দামূলক মত প্রকাশগুলি $(ls | grep ".txt")অবশ্যই প্রতিস্থাপন করতে হবে *.txt( এখানে নিবন্ধটি দেখুন )।

ভাল সমাধান

for i in *.txt;do cat $i >> output.txt;done

1
না কেন for i in $(ls *.txt);do cat $i >> output.txt;done?
স্ট্রিমোস্টারগুলি

2
বাধ্যতামূলক পার্সিংএলগুলি একটি ডাউনভোটের সাথে একত্রে লিঙ্ক করুন (এবং আপনি একাধিক ls | grepডাউনওয়োটের অধিকারী , কারণ এটি মারাত্মক খারাপ প্রতিষেধক)।
gniourf_gniourf

আমার কাছ থেকে একটি উত্সাহ পেয়েছি কারণ এটি আউটপুট দেওয়ার আগে ফাইলের নাম ধরে স্বেচ্ছাসেবী পরীক্ষার / পরিচালনা করার অনুমতি দেয় এবং এটি দ্রুত এবং সহজ এবং অনুশীলনের পক্ষে ভাল। (আমার ক্ষেত্রে আমি চেয়েছিলাম: আমি ইন * এর জন্য; ইকো-ই "\ n $ i: \ n"; বিড়াল $ 1; সম্পন্ন)
নাথান চ্যাপেল

ls *.txtযদি খুব বেশি ফাইল (আর্গুমেন্টের তালিকা খুব দীর্ঘ ত্রুটি) থাকে তবে ব্যর্থ হবে না ?
রাফায়েল আলমেডা

6

শেলের সাথে সর্বাধিক বাস্তব উপায় হল বিড়াল কমান্ড। অন্যান্য উপায় অন্তর্ভুক্ত,

awk '1' *.txt > all.txt
perl -ne 'print;' *.txt > all.txt

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

6

কিভাবে এই পদ্ধতির সম্পর্কে?

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

যেহেতু ওপি বলছে যে ফাইলগুলি একই ডিরেক্টরিতে রয়েছে -maxdepth 1তাই আপনার findকমান্ডটি যুক্ত করতে হতে পারে ।
কোডফোরস্টার

1
বিপুল সংখ্যক ফাইল সহ দুর্দান্ত কাজ করে, যেখানে গৃহীত জবাবের পদ্ধতির ব্যর্থতা
amine

আহ আমি চাই যে আমি এই
প্লাসটি

এটি সঠিক উত্তর হওয়া উচিত। এটি একটি শেল স্ক্রিপ্টে সঠিকভাবে কাজ করবে। আপনি যদি আউটপুট বাছাই করতে চান তবে এখানে একটি অনুরূপ পদ্ধতি রয়েছে:sort -u --output="$OUTPUT_FILE" --files0-from=- < <(find "$DIRECTORY_NAME" -maxdepth 1 -type f -name '*.txt' -print0)
স্টিভএইচ

3
type [source folder]\*.[File extension] > [destination folder]\[file name].[File extension]

উদাহরণ স্বরূপ:

type C:\*.txt > C:\1\all.txt

এটি সি এর মধ্যে সমস্ত টেক্সট ফাইলগুলি নেবে: old ফোল্ডার এবং এটিকে সি: \ 1 ফোল্ডারের মধ্যে all.txt এর নামে সংরক্ষণ করবে

অথবা

type [source folder]\* > [destination folder]\[file name].[File extension]

উদাহরণ স্বরূপ:

type C:\* > C:\1\all.txt

এটি ফোল্ডারে উপস্থিত সমস্ত ফাইলগুলি নেবে এবং সেখানে সি: \ 1 \ all.txt তে সামগ্রী রাখবে


0

আপনি এটির মতো করতে পারেন: cat [directory_path]/**/*.[h,m] > test.txt

যদি আপনি {}যে ফাইলগুলি সন্ধান করতে চান তার এক্সটেনশানটি অন্তর্ভুক্ত করতে ব্যবহার করেন তবে সিকোয়েন্সিংয়ের সমস্যা আছে।


0

আপনি যখন এমন কোনও সমস্যায় পড়েন যেখানে এটি all.txt কে all.txt এ বিড়াল করে, আপনি চেষ্টা করতে পারেন all.txt বিদ্যমান আছে কি নেই, যদি উপস্থিত থাকে তবে সরান

এটার মত:

[ -e $"all.txt" ] && rm $"all.txt"


cat *.txt > all.txt >কমান্ড all.txt ওভাররাইট করে যদি এটি বিদ্যমান থাকে তবে >>বিদ্যমান ফাইলে ডেটা যুক্ত হয়
ওলেগ বোন্ডারেনকো

-4

এগুলি সবই বাজে ....

ls | grep *.txt | while read file; do cat $file >> ./output.txt; done;

সহজ জিনিস।


6
Eeek! এটা করবেন না। করfind . -iname "*.txt" -maxdepth 1 -exec cat {} >> out.txt \;
চিন্ময় কাঞ্চি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.