আমার কাছে ডাকা একটি ফাইলের ভিতরে ফাইলের নামের একটি তালিকা রয়েছে list_of_files.txt
।
আমি সেই তালিকার প্রতিটি ফাইলের বিষয়বস্তু কল করা অন্য একটি ফাইলে কপি করতে চাই all_compounds.sdf
।
কমান্ড লাইন থেকে আমার এটি কীভাবে করা উচিত?
আমার কাছে ডাকা একটি ফাইলের ভিতরে ফাইলের নামের একটি তালিকা রয়েছে list_of_files.txt
।
আমি সেই তালিকার প্রতিটি ফাইলের বিষয়বস্তু কল করা অন্য একটি ফাইলে কপি করতে চাই all_compounds.sdf
।
কমান্ড লাইন থেকে আমার এটি কীভাবে করা উচিত?
উত্তর:
ফাইলের নাম পেতে সহজ কমান্ড প্রতিস্থাপন ব্যবহার করবেন না (যা সহজেই স্পেস এবং অন্যান্য বিশেষ অক্ষরের সাথে ভেঙে যেতে পারে)। এর মতো কিছু ব্যবহার করুন xargs
:
xargs -d '\n' -a list_of_files.txt cat > all_compounds.sdf
বা একটি while read
লুপ:
while IFS= read -r file; do cat "$file"; done < list_of_files.txt > all_compounds.sdf
কমান্ড প্রতিস্থাপনটি নিরাপদে ব্যবহার করতে, কমপক্ষে IFS
কেবলমাত্র নতুন লাইন সেট করুন এবং গ্লোববিং অক্ষম করুন (ওয়াইল্ডকার্ড সম্প্রসারণ):
(set -f; IFS=$'\n'; cat $(cat list_of_files.txt) > all_compounds.sdf)
আশেপাশের বন্ধনীগুলি ()
এটি একটি সাব-শেলের মধ্যে চালিত করতে হবে, যাতে আপনার বর্তমান শেল এই পরিবর্তনগুলি দ্বারা প্রভাবিত না হয়।
দ্রুত এবং নোংরা উপায় ...
cat $(cat list_of_files.txt) >> all_compounds.sdf
দয়া করে মনে রাখবেন: আপনার তালিকার ফাইল নামগুলি খুব ভাল আচরণ করা হলে এটি কাজ করে - যদি ফাঁকা স্থান, নিউলাইনগুলি বা শেলটির বিশেষ অর্থ রয়েছে এমন কোনও অক্ষর থাকে তবে জিনিসগুলি ভুল হয়ে যাবে - নির্ভরযোগ্য ফলাফলের পরিবর্তে এই উত্তরটি ব্যবহার করুন )
cat
কন বিড়াল ফাইল প্রবেশ করে। এটি তাদের বিষয়বস্তুও মুদ্রণ করে।command2 $(command1)
আপনি command1
( cat list...
) থেকে command2
( cat
) এর আউটপুট পাস করতে পারেন যা ফাইলগুলি একত্র করে।তারপরে >>
stdout এ মুদ্রণের পরিবর্তে কোনও ফাইলে আউটপুট প্রেরণ করতে পুনঃনির্দেশ ব্যবহার করুন। আপনি যদি আউটপুট দেখতে চান তবে tee
পরিবর্তে ব্যবহার করুন:
cat $(cat list_of_files.txt) | tee -a all_compounds.sdf
( আপনার ফাইলটি ইতিমধ্যে উপস্থিত থাকলে আমি এর >>
পরিবর্তে >
এবং স্যুইচটি tee
দিয়ে ব্যবহার করেছি -a
- যদি এটি ইতিমধ্যে বিদ্যমান থাকে তবে এটি ওভাররাইট করার পরিবর্তে ফাইলটিতে সংযোজন হয়)
cat
পুরো যুক্তিটিকে একটি যুক্তি হিসাবে পাওয়া যায়।
যদিও জিএনইউ awk
একটি পাঠ্য প্রক্রিয়াকরণ ইউটিলিটি, এটি system()
কলের মাধ্যমে বহিরাগত শেল কমান্ডগুলি চালনার অনুমতি দেয় । আমরা আমাদের সুবিধার্থে এটির মতো ব্যবহার করতে পারি:
$ awk '{cmd=sprintf("cat \"%s\"",$0); system(cmd)}' file_list.txt
এখানে ধারণাটি সহজ: আমরা লাইন দ্বারা ফাইল লাইনটি পড়ি এবং প্রতিটি লাইনের মধ্যে আমরা ফর্ম্যাট স্ট্রিং তৈরি করি cat "File name.txt"
, যা পরে প্রেরণ করা হয় system()
।
এবং এখানে এটি কার্যকর হয়:
$ ls
file1.txt file2.txt file3 with space.txt file_list.txt
$ awk '{cmd=sprintf("cat \"%s\"",$0); system(cmd)}' file_list.txt
Hi, I'm file2
Hi, I'm file1
Hi, I'm file3
সুতরাং আমরা ইতিমধ্যে সেখানে কাজটির বড় অংশটি করেছি - আমরা সমস্ত ফাইল তালিকার মুদ্রণ করেছি। বাকিগুলি খুব সহজ: >
সংক্ষিপ্ত ফাইলে অপারেটরের সাথে ফাইল করতে চূড়ান্ত আউটপুট পুনর্নির্দেশ করুন।
awk '{cmd=sprintf("cat \"%s\"",$0); system(cmd)}' file_list.txt > output.txt
"$(cat list_of_files.txt)"