ফাইলগুলির তালিকা অনুলিপি করুন


35

আমার কাছে একটি ফাইলের ফাঁক দিয়ে পৃথক করা ফাইলগুলির একটি তালিকা রয়েছে list.txt। আমি তাদের একটি নতুন ফোল্ডারে অনুলিপি করতে চাই।

আমি চেষ্টা করেছিলাম:

cp `cat list.txt` new_folder

তবে এটি কার্যকর হয়নি।

আপনি এই কিভাবে করবেন?

হালনাগাদ:

আপনার সমস্ত আকর্ষণীয় উত্তরের জন্য আপনাকে ধন্যবাদ। আমি এতটা চাইনি :)

সমাধানটি দ্বিতীয়বার চেষ্টা করার পরেও মনে হয় যে cpমুদ্রণটি ব্যবহারের সাহায্যে মুদ্রিত হয়েছে কারণ ফোল্ডারটি new_folderএখনও বিদ্যমান নেই! দুঃখিত, এটি একটি মূর্খ ভুল বলে মনে হচ্ছে ... আমি যখন ফোল্ডারটি আগে তৈরি করি তখন এটি কার্যকর হয়।

যাইহোক, আমি আপনার সমস্ত উত্তর এবং সমাধানগুলি থেকে অনেক কিছু শিখেছি, সেগুলি লেখার জন্য আপনি যে সময় নেন তা করার জন্য আপনাকে ধন্যবাদ।


আমাকে একটি জিনিস পরিষ্কার করা যাক: তালিকার এক লাইনে সমস্ত ফাইলের নাম রয়েছে, কেবল একটি স্থান দ্বারা পৃথক করা আছে? নাকি আলাদা আলাদা লাইনের প্রত্যেকটির নাম?
টেলিমাচুস

সমস্ত এক এক চুনে, একটি স্থান দ্বারা পৃথক। ডগ এর সমাধান কাজ করেছে :) উত্তরের জন্য আপনাকে ধন্যবাদ।
ক্লাউস

এটি মজার ... আমি আমার সমাধানটি এমন এক লাইনের সাথে পরীক্ষা করেছি যাতে প্রতিটি নাম পৃথক লাইনে ছিল।
ডগ হ্যারিস

"এটি কার্যকর হয়নি" খুব অর্থবহ নয়। ঠিক কীভাবে এটি কাজ করে নি। এটা আমার জন্য ভালই কাজ করে।
পরবর্তী বিজ্ঞপ্তি না দেওয়া পর্যন্ত বিরতি দেওয়া হয়েছে।

দুঃখিত: এটি সিপি ব্যবহারের সাহায্য দেখিয়েছে। উপরে আমার আপডেট দেখুন।
ক্লাউস

উত্তর:


34

Xargs ব্যবহার করে দেখুন:

cat list.txt | xargs -J % cp % new_folder

হালনাগাদ:

আমি এটি ওএস এক্স এ করেছি যার GNU / লিনাক্স সংস্করণগুলির চেয়ে আলাদা সংস্করণ রয়েছে। xargsযেখান থেকে আসে গনুহ findutils নেই -Jকিন্তু এটা আছে -Iযা অনুরূপ (যেমন ডেনিস উইলিয়ামসন একটি মন্তব্যে উল্লেখ)। Xargs এর ওএস এক্স সংস্করণটির উভয়ই রয়েছে -Iএবং এর -Jকিছুটা আলাদা আচরণ রয়েছে - হয় এই মূল প্রশ্নের জন্য কাজ করবে।

$ cat list.txt
one
two.txt
three.rtf

$ cat list.txt | xargs -J % echo cp % new_folder
cp one two.txt three.rtf new_folder

$ cat list.txt | xargs -I % echo cp % new_folder
cp one new_folder
cp two.txt new_folder
cp three.rtf new_folder

3
আমার xargsকাছে -Jএটি নেই -Iযা একই কাজটি করে বলে মনে হচ্ছে। আপনার কোন সংস্করণ xargsএবং কোন ওএস / বিতরণ রয়েছে?
পরবর্তী বিজ্ঞপ্তি না দেওয়া পর্যন্ত বিরতি দেওয়া হয়েছে।

আমি ম্যাক ওএস এক্স 10.6 (ওরফে স্নো চিতা) এ পরীক্ষা করেছি, সুতরাং ওএসের সাথে এক্সগার্স জাহাজের যে কোনও সংস্করণই হোক না কেন। চলমান xargs --versionএকটি ব্যবহার ত্রুটি বার্তা দেয়। এটি সম্ভবত xargs এর BSD সংস্করণ। এর ব্যবহার -Iএবং -Jসূক্ষ্মভাবে পৃথক। আমি আমার উত্তরটি সুন্দর বিন্যাসিত উদাহরণ সহ আপডেট করব।
ডগ হ্যারিস

হ্যাঁ, আমি ম্যাক ওএসএক্স 10.6 এর সাথে কাজ করছি। সম্পর্কে precisions জন্য আপনাকে ধন্যবাদ -Jএবং -I:)
ক্লস

আপনার কমান্ডগুলি চালনার আগে আপনার প্রতিবেদনটি পরীক্ষা করতে ইকো ব্যবহার করার জন্য এটি একটি ভাল পরামর্শ।
লিয়াম

1
উপরের একই কমান্ডটি শুধুমাত্র প্রয়োজনীয় পরিবর্তনের সাথে ব্যবহার করে, আমি কীভাবে ফাইলগুলি তাদের ডিরেক্টরি এবং সাবডিয়ারগুলি স্ল্যাশ দ্বারা পৃথক করে তৈরি করার সাথে অনুলিপি করব?
ভিকি দেব

54

একেবারেই দরকার নেই cat:

xargs -a list.txt cp -t new_folder

বা দীর্ঘ বিকল্পগুলি ব্যবহার করে:

xargs --arg-file=list.txt cp --target-directory=new_folder

এখানে কয়েকটি শেল সংস্করণ রয়েছে। নোট করুন যে কিছু ভেরিয়েবলগুলি উদ্ধৃত নয় বা forলুপগুলি বিশেষত ব্যবহৃত হয় কারণ ওপি নির্দিষ্ট করেছে যে ফাইলের নামগুলি স্থান সীমানাযুক্ত। এর মধ্যে কয়েকটি কৌশল ফাইল-প্রতি-লাইন ইনপুট জন্য কাজ করবে না যেখানে ফাইলের নামগুলিতে সাদা স্থান রয়েছে।

ব্যাশ:

for file in $(<list.txt); do cp "$file" new_folder; done

অথবা

cp $(<list.txt) new_folder

sh (বা বাশ):

# still no cat!
while read -r line; do for file in $line; do cp "$file" new_folder; done; done < list.txt

অথবা

# none here either
while read -r line; do cp $line new_folder; done < list.txt

অথবা

# meow
for file in $(cat list.txt); do cp "$file" new_folder; done

অথবা

# meow
cp $(cat list.txt) new_folder

নুব প্রশ্ন: কেন -tদরকার xargs -a list.txt cp -t new_folder?
ইয়েবো ইয়াং

1
@ ইয়েবোইং: -tএটি একটি বিকল্প cp। এটি নির্দিষ্ট উত্স ডিরেক্টরিতে সমস্ত উত্স আর্গুমেন্ট অনুলিপি করে। এখানে, এটি xargsকমান্ড দ্বারা যুক্ত হওয়া উত্সের আগে লক্ষ্য নির্দিষ্ট করার অনুমতি দেয় ।
পরবর্তী বিজ্ঞপ্তি না দেওয়া পর্যন্ত বিরতি দেওয়া হয়েছে।

এটি দরকারী তবে list.txt- এ যদি মিশ্র ফাইল এবং ফোল্ডারগুলির পথ থাকে তবে কী হবে? সেক্ষেত্রে কমান্ডটি সঠিকভাবে কাজ করে না। এটি "ডিরেক্টরি বাদ দিচ্ছে ..." এর প্রতিবেদন করে এবং যদি সিআর কমান্ডের সাথে -R নির্দিষ্ট করা থাকে তবে তালিকার প্রথম ফাইলটি উপস্থিত হওয়ার সাথে সাথে "ডিরেক্টরিটি নয়" ত্রুটিটি রিপোর্ট করা হয়।
বেমিপেফ

7

আমার এখানে আগে বিব্রতকরভাবে উত্তর ছিল, কিন্তু ডেনিসের উত্তর আমাকে মনে করিয়ে দিয়েছিল যে আমি সবচেয়ে বেসিক জিনিসটি মিস করেছি। সুতরাং, আমি আমার আসল উত্তরটি মুছলাম। তবে যেহেতু কেউ এই খুব বেসিক জিনিসটি বলেনি , তাই আমি মনে করি এটি এখানে রাখাই ভাল।

মূল প্রশ্নটি হ'ল "আমার কাছে স্পেস-বিভাজিত ফাইলগুলির নামের তালিকা সহ একটি পাঠ্য ফাইল রয়েছে 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স্ট্যান্ডার্ড ইনপুট করার বিষয়বস্তু ডাম্প করতে বলে । যেহেতু প্রথমে $()বিটটি প্রক্রিয়াজাত হয়, তাই পর্যায়ক্রমে যা ঘটে তা এখানে:

  1. cp $(<list.txt) new_folder # split line into three tokens: cp, $(<list.txt), new_folder
  2. cp file1 file2 file3...file# new_folder # substitute result of $(<list.txt) into the larger command

স্পষ্টতই দ্বিতীয় ধাপটি হ'ল সাধারণ cpকমান্ড যা আপনি চেয়েছিলেন।

আমি বুঝতে পারি যে আমি এই (সম্ভবত খুব মৃত) ঘোড়াটিকে অনেক মারছি, তবে আমি মনে করি এটি করা ভাল। শেল কীভাবে একটি কমান্ড প্রক্রিয়াকরণ করে তা সঠিকভাবে বোঝা আপনাকে এটিকে আরও ভালভাবে লিখতে এবং আরও সহজীকরণে সহায়তা করতে পারে। সমস্যাগুলি কোথায় লুকিয়ে থাকার সম্ভাবনা রয়েছে তা এটি আপনাকেও দেখায়। এই ক্ষেত্রে, উদাহরণস্বরূপ, আপনার কাছে আমার প্রথম প্রশ্নটি মজার ফাইলের নাম বা কোনও সম্ভাব্য টাইপ সম্পর্কে হওয়া উচিত ছিল। কোনও অ্যাক্রোব্যাটিক্সের প্রয়োজন ছিল না।


@ ক্লাউস আপনি খুব স্বাগতম। সত্যি বলতে কী, ডেনিসের উত্তর পড়ে এবং বুঝতে পেরে আমি বেশিরভাগই নিজের উপর বিরক্ত হয়ে পড়েছিলাম যে সমস্যার মূল অংশটি আমি পুরোপুরি মিস করেছি। আপনার পছন্দসই সমাধানটি সেখান থেকে।
টেলিমাচাস

এটি একটি অতি পুরানো উত্তর, তবে আপনাকে যদি ফোল্ডার কাঠামোটি পুনরায় তৈরি করতে হয় তবে আপনার --parentsপতাকাটি দরকার । -vকী অনুলিপি করা হয়েছিল তার একটি রেকর্ডের জন্য আপনি এটি ভার্ভোজ করতে পারেন । আপনি যদি অনুমতি রাখতে চান তবে আপনার পতাকা -aবা -pপতাকা দরকার । অর্থাৎ cp --parents -av $(<list.txt) new_folder,। এটি সমস্ত আপনার ফাইলগুলির তালিকা সত্যই সমস্ত ফাইল -rবলে ধরে নিচ্ছে , অন্যথায় আপনারও পুনরুক্তার জন্য পতাকাটির প্রয়োজন হতে পারে ।
ধাউপিন

@ ধৌপিন আসলে, ওপিতে বলা হয়েছে যে তিনি ম্যাকোজে ছিলেন। সুতরাং এটি মূল্যবান জন্য, --parentsপতাকা সেখানে বিদ্যমান নেই। তাদের (BSD- প্রাপ্ত) সংস্করণ cpকেবল সংক্ষিপ্ত বিকল্পগুলি সরবরাহ করে, GNU- স্টাইলের দীর্ঘ বিকল্প নয়। বিএসডি-স্টাইলের cpজন্য, পুনরাবৃত্তির অনুলিপিটির জন্য পতাকা বড় -Rহাতের অক্ষর নয়, ছোট হাতের অক্ষর।
টেলিমাচাস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.