শেল থেকে লিনাক্সে অন্য একটি ফাইল কীভাবে যুক্ত করবেন?


418

আমার দুটি ফাইল রয়েছে: file1এবং file2। আমি কিভাবে বিষয়বস্তু যোগ না file2করার file1তাই বিষয়বস্তু যে file1প্রক্রিয়া জিদ?

উত্তর:


610

ব্যাश বিল্টিন পুনর্নির্দেশ (tldp) ব্যবহার করুন :

cat file2 >> file1

2
আপনি কীভাবে এটি করবেন গন্তব্য ফাইলটি আপনার নিজস্ব নয় এবং আপনার sudo ব্যবহার করা দরকার?
বিজয় রাংটা

1
@ বিজয়রাঙ্গটা: মনে হচ্ছে আপনি নিজের প্রশ্নের উত্তর দিয়েছেন। আপনি কমান্ডটি প্রি-পেন্ড sudoকরবেন cat(এবং অনুরোধ জানালে শংসাপত্রগুলি প্রবেশ করান)।
ডেভিড

আপনার প্রয়োজন ... chmod 777 / ইত্যাদি / ডিফল্ট / ডকার নিজেকে সেই ফাইলটিতে লেখার অনুমতি দেওয়ার জন্য
danday74

1
@ সিগুর: যদি একবারে দুটি ফাইলে আউটপুটকে নির্দেশ করার উপায় না থাকে তবে এতে কমান্ডের দুটি অনুরোধ জড়িত।
ডেভিড

2
@Sigur বা কটাক্ষপাত আছে teeপ্রোগ্রাম: cat 1 | tee -a 2 3। আপনি --append(বা -aসংক্ষিপ্তের জন্য) স্যুইচের পরে আপনার পছন্দ মতো ফাইলগুলি রাখতে পারেন।
স্টিফান ভ্যান ডান আকার

291

cat file2 >> file1

>>অপারেটর নামের ফাইল আউটপুট appends বা নামের ফাইল তৈরি করে যদি এটি বিদ্যমান নেই।

cat file1 file2 > file3

এটি একটিতে দুটি বা ততোধিক ফাইলকে যুক্ত করে। আপনার প্রয়োজন অনুসারে যতগুলি উত্স ফাইল থাকতে পারে। উদাহরণ স্বরূপ,

cat *.txt >> newfile.txt

আপডেট 20130902
মন্তব্যগুলিতে ইউরো সুপারিশ করে "চেষ্টা করবেন না cat file1 file2 > file1"। প্রত্যাশিত ফলাফলটির ফলে এটি না ঘটার কারণটি হ'ল পুনর্নির্দেশ প্রাপ্ত ফাইলটি বাম দিকে বাম দিকে কমান্ড >কার্যকর হওয়ার আগে প্রস্তুত করা হয়। এই ক্ষেত্রে, প্রথমে file1শূন্য দৈর্ঘ্যে কাটা হয় এবং আউটপুট জন্য খোলা হয়, তারপরে catকমান্ডটি এখন শূন্য-দৈর্ঘ্যের ফাইলটি এবং এর মধ্যে থাকা সামগ্রীর সাথে যুক্ত করতে file2চেষ্টা করে file1। ফলাফলটি হ'ল এর মূল বিষয়বস্তুগুলি file1হারিয়ে গেছে এবং এর জায়গায় একটি অনুলিপি file2যা সম্ভবত প্রত্যাশিত ছিল না।

আপডেট 20160919
মন্তব্যে tpartee ব্যাকিং তথ্য / উত্সের সাথে লিঙ্ক করার পরামর্শ দেয়। একটি অনুমোদনমূলক রেফারেন্সের জন্য, আমি দয়া করে পাঠককে লিনাক্সকম্যান্ড.অর্গ.এজে sh ম্যান পেজে পরিচালিত করি:

কমান্ড কার্যকর হওয়ার আগে, শেল দ্বারা ব্যাখ্যা করা একটি বিশেষ স্বরলিপি ব্যবহার করে এর ইনপুট এবং আউটপুট পুনর্নির্দেশ করা যেতে পারে।

যদিও এটি পাঠককে তাদের কী জানা দরকার তা যদি আপনি এটি সন্ধান না করেন এবং বিবৃতি শব্দের দ্বারা শব্দটিকে পৃথক করে না রাখেন তবে তা সহজেই অনুমেয়। এখানে 'আগে' হওয়া সবচেয়ে গুরুত্বপূর্ণ শব্দ। কমান্ড কার্যকর হওয়ার পূর্বে পুনঃনির্দেশটি সম্পন্ন (বা ব্যর্থ) ।

cat file1 file2 > file1শেলের উদাহরণে প্রথমে পুনর্নির্দেশটি সঞ্চালন করে যাতে I / O হ্যান্ডলগুলি যে পরিবেশে কমান্ড কার্যকর হওয়ার আগে কার্যকর করা হবে তার স্থানে রয়েছে।

পুনর্নির্দেশের অগ্রাধিকারটি দৈর্ঘ্যে আবৃত এমন একটি বন্ধুত্বপূর্ণ সংস্করণ ইয়ান অ্যালেনের ওয়েবসাইটে লিনাক্স কোর্সওয়্যার আকারে পাওয়া যাবে। তাঁর আই / ও পুনঃনির্দেশ নোট পৃষ্ঠাগুলিতে এই বিষয়টিতে আরও অনেক কিছু বলা আছে, পর্যবেক্ষণ সহ যে কোনও নির্দেশ না দিয়েও পুনঃনির্দেশ কাজ করে। এটি শেলের কাছে পৌঁছে দেওয়া:

$ >out

... নামকরণ করা একটি খালি ফাইল তৈরি করে। শেলটি প্রথমে I / O পুনঃনির্দেশ সেট আপ করে, তারপরে একটি কমান্ড সন্ধান করে, কিছুই খুঁজে পায় না এবং অপারেশন সম্পূর্ণ করে।


17
@ আসির - চেষ্টা করবেন না cat file1 file2 > file1- এটি সম্ভবত আপনি অপেক্ষা করছেন এমন কাজ করবে না।
ইউরোমো

5
আসলে এটিই তাঁর প্রয়োজন। তিনি "বর্তমান ফাইল 1 টি ওভাররাইট না করে" বলেছেন। প্রথম তিন জন উত্তরদাতারা প্রশ্নের এই অংশটিকে পুরোপুরি উপেক্ষা করেছেন এবং একটি কমান্ড ব্যবহারের পরামর্শ দিয়েছিলেন >>যা ফাইলটি পরিবর্তন করবেfile1 । টি.রব তার উত্তরটি ব্যাখ্যা করার চেয়ে আরও ভাল কাজ করেছেন কেবলমাত্র এমন কিছু জমা দেওয়ার জন্য যা দৌড়ের দিক থেকে সত্য ছিল ভুল। প্রশ্নের পাঠ্যের ভিত্তিতে, আমি বিশ্বাস করি যে cat file1 file2 > file3এটিই উপযুক্ত আদেশ যা @ আসির সন্ধান করেছিল।
dm78

দয়ালু শব্দগুলির জন্য ধন্যবাদ, ডেভিড! @ নিউমিরো যা উপরে তুলে ধরেছে তবে তার বিস্তারিতভাবে যায় না তা >হ'ল প্রথমে ডানদিকের অপারেশনটি কার্যকর করা হয়। সুতরাং মৃত্যুদন্ড কার্যকর করার cat file1 file2 > file1পরে প্রথমে নূন্যতম file1দৈর্ঘ্যের ফাইলটি অনুলিপি করার চেষ্টা করা হবে। ক্রিয়াকলাপটি যে ক্রমটি ঘটতে পারে এবং হওয়া উচিত সে সম্পর্কে আপনি যখন চিন্তা করেন তবে এটি যথেষ্ট সূক্ষ্ম যে এটি বহু লোককে অবাক করে তোলে। সুতরাং অন্য কিছু না হলে, ইউরো এবং আপনি উত্তরটি আরও উন্নতি করতে বলেছেন। তার জন্য ধন্যবাদ!
টি.রব

এছাড়াও না চেষ্টা বিড়াল file1 >> file1, এই ফাইলটি যাও recursively পুনর্লিখিত করা যাবে না, আমি ভুল করে এই কাজ করতে এবং মাত্র কয়েক সেকেন্ডের মধ্যে, 50 মিলিয়ন লাইন মাত্র পূর্বে কয়েক ডজন লাইন থেকে ফাইলে রাখা হয়েছে।
হেন্দ্র উজিয়া

এছাড়াও, এটি আরও কিছুটা সংক্ষিপ্ত করে তুলতে, যদি "নতুন ফাইল" ইতিমধ্যে উপস্থিত থাকে তবে ফাইলটিতে >> সংযোজন হয় এবং ফাইলটি > প্রতিস্থাপন করে।
রিনোগো

43

দ্রষ্টব্য : আপনার যদি sudo ব্যবহারের প্রয়োজন হয় তবে এটি করুন:

sudo bash -c 'cat file2 >> file1'

sudoকমান্ডটি কেবল প্রিপেন্ডিংয়ের স্বাভাবিক পদ্ধতিটি ব্যর্থ হবে, যেহেতু সুবিধাবদ্ধতা বৃদ্ধি আউটপুট পুনঃনির্দেশের মধ্যে নিয়ে যায় না।


6
এই জন্য আরেকটি সাধারণ বাগ্ধারা হয়cat file2 | sudo tee -a file1 > /dev/null
ianw

28

এই আদেশটি ব্যবহার করে দেখুন:

cat file2 >> file1

13

কেবলমাত্র রেফারেন্সের জন্য, ddrescue ব্যবহার করে টাস্কটি অর্জনের একটি বাধা উপায় সরবরাহ করে যদি উদাহরণস্বরূপ, আপনার কাছে বড় ফাইল এবং বিরতি দেওয়ার দরকার পড়ে এবং পরে কিছুটা পরে চালিয়ে যান:

ddrescue -o $(wc --bytes file1 | awk '{ print $1 }') file2 file1 logfile

logfileগুরুত্বপূর্ণ বিট। আপনি Ctrl-Cঠিক একই কমান্ডটি আবার নির্দিষ্ট করে আবার প্রক্রিয়াটি বাধাগ্রস্থ করতে এবং পুনরায় সূচনা করতে পারেন logfileএবং ddrescue এখান থেকে পড়ে এবং পুনরায় শুরু করবে । -o Aপতাকা ddrescue বলে বাইট থেকে শুরু করতে একটি আউটপুট ফাইলের মধ্যে ( file1)। সুতরাং wc --bytes file1 | awk '{ print $1 }'কেবল file1বাইটগুলির আকার বের করুন (আপনি lsযদি চান তবে আউটপুটটিতে কেবল পেস্ট করতে পারেন)।

মন্তব্যগুলিতে এনজিএস দ্বারা নির্দেশিত হিসাবে, খারাপ দিকটি হ'ল ডিড্রেস্কু সম্ভবত ডিফল্টরূপে ইনস্টল করা হবে না, সুতরাং আপনাকে এটি ম্যানুয়ালি ইনস্টল করতে হবে। অন্য জটিলতাটি হ'ল ড্রেসস্কুতে দুটি সংস্করণ রয়েছে যা আপনার সঞ্চিতাগুলিতে থাকতে পারে: আরও তথ্যের জন্য এই জিজ্ঞাসাবাদু প্রশ্নটি দেখুন। আপনি যে সংস্করণটি চান তা হ'ল GNU ddrescue এবং ডেবিয়ান-ভিত্তিক সিস্টেমে নাম দেওয়া প্যাকেজটি রয়েছে gddrescue:

sudo apt install gddrescue

অন্যান্য ডিস্ট্রোদের জন্য ddrescue এর GNU সংস্করণের জন্য আপনার প্যাকেজ পরিচালনা সিস্টেমটি পরীক্ষা করুন ।


1
নতুন ব্যবহারকারীদের সুবিধার জন্য: ddrescue একটি জিএনইউ সরঞ্জাম, তবে এটি আপনার লিনাক্স, ম্যাক বা অন্যান্য ইউনিক্স-মতো সিস্টেমে থাকতে পারে না। ddrescue POSIX বা অন্য কোনও মানক দ্বারা প্রয়োজনীয় বলে মনে হচ্ছে না।

2

আরেকটি সমাধান:

cat file1 | tee -a file2

tee আপনার সুবিধায় আপনি যতগুলি ফাইল যুক্ত করতে পারেন তার সুবিধা রয়েছে, উদাহরণস্বরূপ:

cat file1 | tee -a file2 file3 file3

বিষয়বস্তু যোগ হবে file1থেকে file2, file3এবং file4

ম্যান পৃষ্ঠা থেকে:

-a, --append
       append to the given FILEs, do not overwrite

0

catসহজ সমাধান হতে পারে তবে এটি যখন আমরা বড় ফাইলগুলিকে একত্রিত করি তখন খুব ধীর হয়ে যায়, find -printআপনাকে উদ্ধার করা, যদিও আপনাকে একবার বিড়াল ব্যবহার করতে হবে।

amey@xps ~/work/python/tmp $ ls -lhtr
total 969M
-rw-r--r-- 1 amey amey 485M May 24 23:54 bigFile2.txt
-rw-r--r-- 1 amey amey 485M May 24 23:55 bigFile1.txt

 amey@xps ~/work/python/tmp $ time cat bigFile1.txt bigFile2.txt >> out.txt

real    0m3.084s
user    0m0.012s
sys     0m2.308s


amey@xps ~/work/python/tmp $ time find . -maxdepth 1 -type f -name 'bigFile*' -print0 | xargs -0 cat -- > outFile1

real    0m2.516s
user    0m0.028s
sys     0m2.204s

আপনার সন্ধান / বিড়াল কম্বো কমান্ডের জন্য সময় সাশ্রয়ের জন্য প্রতিবেদন করার কারণ আপনি কেবল ফাইন্ড কমান্ডের সময় নির্ধারণ করছেন যা ফাইলগুলির নাম মুদ্রণ করছে। পুরো কমান্ডটির মতো সময় নির্ধারণের চেষ্টা করুন: time (find . -maxdepth 1 -type f -name 'bigFile*' -print0 | xargs -0 cat -- > outFile1)এবং এটি আপনার বিড়াল কেবল কমান্ডের মতোই ফলাফল তৈরি করে।
JoshMc

0

আপনি এগুলি ছাড়াও এটি করতে পারেন cat, যদিও সততার catসাথে আরও পাঠযোগ্য:

>> file1 < file2

>>Appends stdin করতে file1এবং <ডাম্প file2করার stdin



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