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


15

আমার কাছে ডাকা একটি ফাইলের ভিতরে ফাইলের নামের একটি তালিকা রয়েছে list_of_files.txt

আমি সেই তালিকার প্রতিটি ফাইলের বিষয়বস্তু কল করা অন্য একটি ফাইলে কপি করতে চাই all_compounds.sdf

কমান্ড লাইন থেকে আমার এটি কীভাবে করা উচিত?

উত্তর:


20

ফাইলের নাম পেতে সহজ কমান্ড প্রতিস্থাপন ব্যবহার করবেন না (যা সহজেই স্পেস এবং অন্যান্য বিশেষ অক্ষরের সাথে ভেঙে যেতে পারে)। এর মতো কিছু ব্যবহার করুন 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)

আশেপাশের বন্ধনীগুলি ()এটি একটি সাব-শেলের মধ্যে চালিত করতে হবে, যাতে আপনার বর্তমান শেল এই পরিবর্তনগুলি দ্বারা প্রভাবিত না হয়।


14

দ্রুত এবং নোংরা উপায় ...

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- যদি এটি ইতিমধ্যে বিদ্যমান থাকে তবে এটি ওভাররাইট করার পরিবর্তে ফাইলটিতে সংযোজন হয়)


1
@Zanna কমান্ড বদল শব্দ বিভাজন এড়াতে, মত উদ্ধৃত"$(cat list_of_files.txt)"
Sergiy Kolodyazhnyy

4
@ সার্জ যদি শব্দ বিভাজনটি করা না হয় তবে catপুরো যুক্তিটিকে একটি যুক্তি হিসাবে পাওয়া যায়।
মুড়ু

@ মুরু ঠিক আছে, তারপরে স্পেস থাকা ফাইলনামগুলির সাথে আমরা কীভাবে व्यवहार করব?
সের্গেই কোলোডিয়াজনি

1
@Serg সেট Ifs তদনুসারে - আমার উত্তর শেষ প্যারা দেখুন
muru

4

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