বাশ: ফোল্ডার কাঠামো সংরক্ষণ করে নামযুক্ত ফাইলগুলি অনুলিপি করে অনুলিপি করুন


103

আমি আশা করছিলাম:

cp -R src/prog.js images/icon.jpg /tmp/package

গন্তব্যস্থলে একটি প্রতিসম কাঠামো উত্পন্ন করবে:

/tmp
|
+-- package
    |
    +-- src
    |   |
    |   +-- prog.js
    |
    +-- images
        |
        +-- icon.jpg

তবে পরিবর্তে, উভয় ফাইলই / tmp / প্যাকেজে অনুলিপি করা হয়েছে। একটি ফ্ল্যাট কপি। (এটি ওএসএক্সে রয়েছে)।

একটি সাধারণ বাশ ফাংশন কি আমি গন্তব্য ডিরেক্টরিতে সঠিক জায়গায় ওয়াইল্ডকার্ড দ্বারা নির্দিষ্ট ফাইলগুলি (যেমন src / *। জেএস) সহ সমস্ত ফাইল অনুলিপি করতে ব্যবহার করতে পারি। কিছুটা "প্রতিটি ফাইলের জন্য, চালান mkdir -p $(dirname "$file"); cp "$file" $(dirname "$file")" এর মতো, তবে সম্ভবত একটি কমান্ড।

এটি একটি প্রাসঙ্গিক থ্রেড, যা পরামর্শ দেয় এটি সম্ভব নয়। যদিও লেখকের সমাধানটি আমার পক্ষে এতটা কার্যকর নয়, কারণ আমি কেবল ফাইল, ওয়াইল্ডকার্ড বা না থাকায় একটি তালিকা সরবরাহ করতে চাই এবং সেগুলি সমস্ত গন্তব্যস্থলে অনুলিপি করে দিতে চাই। আইআইআরসি এমএস-ডস এক্সকপিটি এটি করে তবে সিপির জন্য কোনও সমতুল্য বলে মনে হচ্ছে না।

উত্তর:


153

আপনি কি - প্যারেন্টস বিকল্পটি ব্যবহার করার চেষ্টা করেছেন? আমি জানি না ওএস এক্স সেটিকে সমর্থন করে কিনা, তবে এটি লিনাক্সে কাজ করে।

cp --parents src/prog.js images/icon.jpg /tmp/package

যদি এটি ওএস এক্সে কাজ করে না, চেষ্টা করুন

rsync -R src/prog.js images/icon.jpg /tmp/package

যেমন প্রস্তাবিত


4
ধন্যবাদ। "সিপি - প্যারেন্টস" ম্যাকের পক্ষে সম্ভব নয়, তবে অন্য ইউনিক্সেনের জন্য পতাকাটি জেনে ভাল লাগছে। আরএসএনসিআর-এই সমস্যাটির সহজতম পোর্টেবল সমাধান।
মাহমোফ

1
আমি এটিকে এটির কমনীয়তা / স্মরণীয়তার জন্য মেনে নিয়েছি, তবে সন্ধান পেয়েছি এটি পুরো ডিরেক্টরিগুলি (কমপক্ষে ওএসএক্সে) অনুলিপি করে না, যেখানে নীচের ট্যারিটি এটি করে।
মাহেমফ

cp --parentsওএসএক্সে (বিএসডি সিপি) অবৈধ বিকল্প, তবে gcp(জিএনইউ সিপি) ভাল কাজ করে। এটি আপনার সিস্টেমে না থাকলে এখনও ব্যবহার করুন brew install coreutils। জি-প্রিফিক্স সহ ইউ এর অনেকগুলি ব্যবহার রয়েছে।
kyb

@ মাহেমফ cp -R --parentsএবং rsync -rRফাইল এবং ডিরেক্টরি উভয়ই অপেক্ষাকৃত অনুলিপি করে।
ভোর্টিকো

22

একমুখী:

tar cf - <files> | (cd /dest; tar xf -)

ওহ, আমি আমার উত্তরের চেয়ে এটি আরও ভাল পছন্দ করি।
EMPraptor

4
আপনি -Cchdir করার বিকল্পটিও ব্যবহার করতে পারেন - tar cf - _files_ | tar -C /dest xf -বা এর মতো কিছু।
ডি.শ্যাওলি

ধন্যবাদ, এটি সংক্ষিপ্ত, যদিও আমি সরলতার জন্য rsync পছন্দ করি।
মাহেমফ

1
গ্রেট! কেউ কীভাবে এটিকে শেল কমান্ডে রূপান্তর করতে জানে? এটি এন ইনপুট গ্রহণ করা উচিত, প্রথম এন -1 হ'ল অনুলিপি করা ফাইল এবং শেষটি গন্তব্য ফোল্ডার।
এয়ার্ড করুন

@ আরোদ $ {! # the হ'ল সর্বশেষ পরম এবং এটি পূর্ববর্তী যুক্তিগুলি স্ট্যাকওভারফ্লো.com/ জিজ্ঞাসা / 1215538/… পেতে ব্যবহার করুন । আপনি যদি কমান্ডটি লিখেন তবে দয়া করে এখানে সংক্ষেপে লিঙ্ক করুন।
মাহেমফ

18

বিকল্পভাবে, আপনি যদি পুরানো-স্কুল হন তবে সিপিও ব্যবহার করুন:

cd /source;
find . -print | cpio -pvdmB /target

স্পষ্টতই, আপনি আপনার হৃদয়ের সামগ্রীতে ফাইল তালিকা ফিল্টার করতে পারেন।

'-P' বিকল্পটি 'পাস-থ্রো' মোডের জন্য (ইনপুটটির জন্য '-i' বা আউটপুটের জন্য '-o' এর বিপরীতে)। '-V' হ'ল ভারবোজ (ফাইলগুলি প্রক্রিয়া করার সাথে সাথে তালিকাবদ্ধ করুন)। '-ম' পরিবর্তনের সময়গুলি সংরক্ষণ করে। '-বি' অর্থ 'বড় ব্লক' ব্যবহার করুন (যেখানে বড় ব্লকগুলি 512 বাইটের পরিবর্তে 5120 বাইট হয়); এই দিনগুলিতে এর কোনও প্রভাব নেই এটি সম্ভব।


1
বিকল্পের -print0সংমিশ্রণটি ব্যবহার করা আরও ভাল --nullযাতে এটি বিশেষ চরিত্রগুলি এবং find . -print0 | cpio -pvdmB --null /target
যেমনগুলির

এটিকে পুরাতন-স্কুল বলুন, এটিকে পোর্টেবল বলুন, যা কিছু কল করুন, তবে আমি অবশ্যই cpioএই কাজের জন্য বিশ্বাস করি trust আমি সম্মত হই যে -print0এবং -nullবিকল্পগুলি ব্যবহার করা উচিত, অন্যথায়, কিছু সময়, কেউ আপনাকে 'বিশেষ অক্ষর' (স্পেসস, সম্ভবতঃ) দিয়ে কিছু ফোল্ডার দেবে এবং কিছু ঘটবে। আমি ব্যক্তিগত অভিজ্ঞতা থেকে বলছি না এমন নয়, তবে আপনি ফাইলের একগুচ্ছ ব্যাকআপ নেওয়ার চেষ্টা করতে পারেন এবং ফাইলের নাম থাকার কারণে ফাঁকা থাকার কারণে কেবলমাত্র অর্ধেক ব্যাক আপ দিয়ে শেষ করতে পারেন। (ঠিক আছে, আমি ব্যক্তিগত অভিজ্ঞতা থেকে কথা বলছি।)
bballdave025

@ বুবল্ডেভে025: আপনি কেবল cpioফাইল সমস্যার সাথে নতুন লাইনের মতো সমস্যা দেখা দিচ্ছেন - তবে আপনি সাধারণত দুটি (বা ততোধিক) ফাইলের নাম ফাইল ফাইলের প্রতিটি নতুন লাইনের জন্য খুঁজে না পাওয়া সম্পর্কে একটি ত্রুটি বার্তা দিয়ে শেষ করেন। (কখনও কখনও, আপনি কম বার্তা পেতে পারেন - তবে পরীক্ষার কেসটি গঠনে এর যথেষ্ট যত্ন প্রয়োজন requires)। আমি যখন ব্যবহার করেছি cpio, তখন কোনও --nullবিকল্প ছিল না ; ডাবল-ড্যাশ বিকল্পগুলি এসভিআর 4 বিকল্প স্বীকৃতিগুলির অংশ ছিল না এবং এর ধারণাগুলিও কোনওটিতে -print0উপস্থিত ছিল না find। তবে এটি দীর্ঘ সময় আগে (উদাহরণস্বরূপ 90-এর দশকের মাঝামাঝি। লিনাক্স আধিপত্য অর্জনের আগে)।
জনাথন লেফলার

বিশদ, জনাথন_ লেফলার জন্য ধন্যবাদ। আমি এখানে স্টাফ শেখার পছন্দ করি। এখন, আমি মনে রাখার চেষ্টা করছি যে আমি কোন পুনরাবৃত্ত-অনুলিপি ভুলটি করেছি যা আমাকে স্পেসগুলির সাথে সমস্যা দিয়েছে - আমি যে ভুলটি করতে পারি তার প্রচুর উপায় রয়েছে,
625

@ বুবল্ডেভি0২—— একটি সম্ভাবনা xargsমিশ্রণটি ব্যবহার করছে - এটি সাদা স্থান - ফাঁকা, ট্যাবগুলি, নিউলাইনগুলিতে বিভক্ত হয়। ওতো, আমি নিশ্চিত না যে আপনি কীভাবে বা কেন এটি করতেন। cpioআউটপুট মোডে থাকা জিএনইউ মানুল প্রতি লাইনে একটি ফাইলের নাম সম্পর্কে পরিষ্কার। এসভিআর 4 ব্যবহারকারী ম্যানুয়াল (মুদ্রিত 1990) অস্পষ্ট: cpio -o(কপি-আউট মোড) পাথনামগুলির একটি তালিকা পাওয়ার জন্য স্ট্যান্ডার্ড ইনপুট পড়ে এবং সেই ফাইলগুলি স্ট্যান্ডার্ড আউটপুটে পাথের নাম এবং স্থিতির তথ্যের সাথে অনুলিপি করে। সুতরাং একটি সুযোগ আছে যে এটি স্পেসে নামগুলি ভেঙে দেয়।
জোনাথন লেফলার

16

আরএসআইএনসি-র বিকল্পটি আপনার প্রত্যাশা অনুযায়ী করবে। এটি একটি খুব বৈশিষ্ট্য সমৃদ্ধ ফাইল কপিয়ার। উদাহরণ স্বরূপ:

$ rsync -Rv src/prog.js images/icon.jpg /tmp/package/
images/
images/icon.jpg
src/
src/prog.js

sent 197 bytes  received 76 bytes  546.00 bytes/sec
total size is 0  speedup is 0.00

নমুনা ফলাফল:

$ find /tmp/package
/tmp/package
/tmp/package/images
/tmp/package/images/icon.jpg
/tmp/package/src
/tmp/package/src/prog.js


1

চেষ্টা করুন ...

for f in src/*.js; do cp $f /tmp/package/$f; done

সুতরাং আপনি মূলত যা করছেন তার জন্য ...

for f in `echo "src/prog.js images/icon.jpg"`; do cp $f /tmp/package/$f; done

অথবা

v="src/prog.js images/icon.jpg"; for f in $v; do cp $f /tmp/package/$f; done

আপনার দরকার নেই echoবা $vএখানে নেই। এছাড়াও সংশ্লিষ্ট ডিরেক্টরি যদি গন্তব্যে উপস্থিত না থাকে তবে এই পদ্ধতিটি ব্যর্থ হবে।
ওয়েজুন চাউ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.