আমার এখানে আগে বিব্রতকরভাবে উত্তর ছিল, কিন্তু ডেনিসের উত্তর আমাকে মনে করিয়ে দিয়েছিল যে আমি সবচেয়ে বেসিক জিনিসটি মিস করেছি। সুতরাং, আমি আমার আসল উত্তরটি মুছলাম। তবে যেহেতু কেউ এই খুব বেসিক জিনিসটি বলেনি , তাই আমি মনে করি এটি এখানে রাখাই ভাল।
মূল প্রশ্নটি হ'ল "আমার কাছে স্পেস-বিভাজিত ফাইলগুলির নামের তালিকা সহ একটি পাঠ্য ফাইল রয়েছে I কীভাবে আমি সেগুলি একটি লক্ষ্য ডিরেক্টরিতে অনুলিপি করতে পারি" " প্রথমে এটি জটিল এবং জটিল বলে মনে হতে পারে, কারণ আপনি মনে করেন যে কোনওভাবেই আপনাকে কোনও নির্দিষ্ট উপায়ে ফাইল থেকে আইটেমগুলি বের করতে হবে। যাইহোক, যখন শেল কমান্ড লাইন প্রক্রিয়া, প্রথম জিনিস এটা আছে হয় টোকেন মধ্যে আর্গুমেন্ট তালিকার আলাদা এবং (এখানে একটু কেউ কিছু বলেছেন সরাসরি থাকবে) স্পেস আলাদা টোকেন । (নিউলাইনগুলি পৃথক টোকেনও এ কারণেই ডগ হ্যারিসের একটি নতুন লাইন পৃথক তালিকার পরীক্ষার ফলাফল একই ফলাফল পেয়েছে)) এটি শেলটি প্রত্যাশা করে এবং ইতিমধ্যে একটি স্পেস-বিচ্ছিন্ন তালিকা পরিচালনা করতে পারে।
সুতরাং আপনাকে এখানে যা করতে হবে তা হ'ল স্পেস-বিভাজিত তালিকাটি (আপনার ইতিমধ্যে রয়েছে) আপনার কমান্ডের সঠিক জায়গায় স্থাপন করা। আপনার আদেশটি এতে কিছুটা ভিন্নতা:
cp file1 file2 file3...file# target
একমাত্র বলি হ'ল আপনি নিজের পাঠ্য ফাইল থেকে 1 টির মাধ্যমে # ফাইলের তালিকা পেতে চান।
ডেনিস যেমন নিজের মন্তব্যে উল্লেখ করেছেন, আপনার আসল প্রচেষ্টা ( cp
বিড়াল তালিকা। টেক্সট new_folder
) ইতিমধ্যে কাজ করা উচিত ছিল। কেন? কারণ অভ্যন্তরীণ কমান্ডটি cat list.txt
প্রথমে শেল দ্বারা প্রক্রিয়া করা হয় এবং এতে প্রসারিত হয় file1 file2 file3...file#
, যা শেলটি ঠিক কমান্ডের সেই অংশে প্রত্যাশা করে এবং চায়। যদি এটি কাজ না করে তবে (1) আপনার টাইপ ছিল বা (2) আপনার ফাইলের নামগুলি একরকম অদ্ভুত ছিল (তাদের স্পেস বা অন্যান্য অস্বাভাবিক অক্ষর ছিল)।
ডেনিসের সমস্ত উত্তর কাজ করার কারণটি কেবল এটাই যে তারা cp
কাজ করার জন্য ফাইলের প্রয়োজনীয় তালিকা সরবরাহ করে, সেই তালিকাটি এটি সম্পূর্ণ কমান্ডের অন্তর্ভুক্ত যেখানে স্থাপন করে। আবার, কমান্ড নিজেই এটি কাঠামোর মধ্যে:
cp list-of-files target_directory
এই সংস্করণে এই সমস্ত কীভাবে একত্রিত হয় তা সহজেই দেখা যায়:
cp $(<list.txt) new_folder
$()
শেলটি প্রথম বন্ধনীগুলির মধ্যে কমান্ডটি চালিত করে এবং তারপরে বৃহত্তর লাইনের সেই বিন্দুতে এর আউটপুটটি প্রতিস্থাপন করে। তারপরে শেল পুরোপুরি লাইনটি চালায়। যাইহোক, $()
আপনি ইতিমধ্যে ব্যাকটিক্স (`) দিয়ে যা করছিলেন তার একটি আরও আধুনিক সংস্করণ। পরবর্তী: <
একটি ফাইল পুনর্নির্দেশ অপারেটর। এটি শেলটিকে list.txt
স্ট্যান্ডার্ড ইনপুট করার বিষয়বস্তু ডাম্প করতে বলে । যেহেতু প্রথমে $()
বিটটি প্রক্রিয়াজাত হয়, তাই পর্যায়ক্রমে যা ঘটে তা এখানে:
cp $(<list.txt) new_folder
# split line into three tokens: cp, $(<list.txt), new_folder
cp file1 file2 file3...file# new_folder
# substitute result of $(<list.txt) into the larger command
স্পষ্টতই দ্বিতীয় ধাপটি হ'ল সাধারণ cp
কমান্ড যা আপনি চেয়েছিলেন।
আমি বুঝতে পারি যে আমি এই (সম্ভবত খুব মৃত) ঘোড়াটিকে অনেক মারছি, তবে আমি মনে করি এটি করা ভাল। শেল কীভাবে একটি কমান্ড প্রক্রিয়াকরণ করে তা সঠিকভাবে বোঝা আপনাকে এটিকে আরও ভালভাবে লিখতে এবং আরও সহজীকরণে সহায়তা করতে পারে। সমস্যাগুলি কোথায় লুকিয়ে থাকার সম্ভাবনা রয়েছে তা এটি আপনাকেও দেখায়। এই ক্ষেত্রে, উদাহরণস্বরূপ, আপনার কাছে আমার প্রথম প্রশ্নটি মজার ফাইলের নাম বা কোনও সম্ভাব্য টাইপ সম্পর্কে হওয়া উচিত ছিল। কোনও অ্যাক্রোব্যাটিক্সের প্রয়োজন ছিল না।