লিনাক্সে লুকানো (ডট দিয়ে শুরু) ফাইল এবং উপ-ডিরেক্টরিগুলি কীভাবে অনুলিপি করবেন?


10

ফোল্ডার এ এ ফোল্ডারে কীভাবে লুকানো ফাইল এবং লুকানো উপ-ডিরেক্টরিগুলি (একটি বিন্দু দিয়ে শুরু করা হয়) অনুলিপি করবেন? উদাহরণস্বরূপ যদি আমার এই কাঠামো থাকে:

A/a
A/b
A/.a
A/.b/
A/.b/somefile
A/.b/.c

আমি খ- এ কেবলমাত্র লুকানো ফাইল এবং লুকানো সাব-ডাইরেক্টরিগুলিকে কপি করতে চাই:

B/.a
B/.b/
B/.b/somefile
B/.b/.c

আমি ইতিমধ্যে এই কমান্ড চেষ্টা করেছি: cp A/.* Bথেকে অন্য সুপারইউজার প্রশ্ন । তবে এটি উপ-ডিরেক্টরিগুলি অনুলিপি করে না। চেষ্টাও করেছেন cp -r A/.* B, তবে এটি অনুলিপি করে .তাই আমি এ এর ​​একটি অনুলিপি (সাধারণ ফাইলগুলি সহ) দিয়ে শেষ করি। কোন সাহায্য প্রশংসা করা হয়।

উত্তর:


16

যতক্ষণ আপনি কেবল এ এর ​​স্তরে লুকানো ফাইল এবং ফোল্ডার সন্ধান করছেন এবং উদাহরণস্বরূপ না চান

A/b/.hidden

অনুলিপি করতে, আপনার এটি ব্যবহার করতে সক্ষম হওয়া উচিত:

cp -r A/.[^.]* B

এর মূল অর্থ হ'ল একটি .এবং তারপরে শুরু হওয়া যে কোনও অক্ষর .যা ফিল্টার আউট .এবং এর বাইরে অন্য কোনও অক্ষর copy..

সম্পাদনা: সিপি কমান্ড থেকে -p সরানো হয়েছে যেহেতু প্রশ্নকর্তা নির্দেশ দেয় নি যে তিনি কোনও মালিকানা, তারিখ ইত্যাদি সংরক্ষণ করতে চান indicated


এটি প্রশ্নের মধ্যে দেওয়া উদাহরণস্বরূপ ফাইল এবং ডিরেক্টরিগুলির নামের জন্য কাজ করে , তবে প্রশ্নের পাঠ্যটি "লুকানো ফাইল এবং লুকানো সাব-ডিরেক্টরিগুলি (যেগুলি একটি বিন্দু দিয়ে শুরু করবে)" বলে, এবং এই উত্তরটি এমন ফাইল এবং ডিরেক্টরি খুঁজে পাবে না যার নাম দিয়ে শুরু হয় দুটি বিন্দু; যেমন ..c,।
স্কট

এটি বেশ প্রান্তের মামলা, তবে বৈধ উদ্বেগ-হ'ল কম নয়। আমি এটা বিবেচনা করা হয়নি। আপনি স্যুইচ করে এইটির জন্য অ্যাকাউন্ট করতে পারেন .*[^.]তবে তারপরে আপনি এগুলির সাথে শেষ হওয়া ফাইলগুলি মিস করবেন .। আমি মনে করি সত্যিকার অর্থে সমস্ত ক্ষেত্রে দায়বদ্ধ হওয়ার জন্য আপনার অবশ্যই প্রসারিত গ্লোববিংয়ের প্রয়োজন হবে।
সর্বজনীন উপস্থিতি

4

সমস্যাটি A/.*হ'ল একটি ডিরেক্টরি .রয়েছে Aযা প্যাটার্নের সাথেও মেলে।

আপনি বর্ধিত গ্লোব নিদর্শনগুলি চালু করতে পারেন এবং নিম্নলিখিতগুলি ব্যবহার করতে পারেন:

shopt -s extglob
cp -r A/.!(?(.)) B    

এটি এমন ফাইলগুলির সাথে মেলে যাঁর নামটি একটি বিন্দু দিয়ে শুরু হয় এবং যার দ্বিতীয় অক্ষরটি কোনও বিন্দু নয় বা কিছুই নয় (? (()) কিছুই বা কোনও বিন্দুর সাথে মেলে না! কিছুই বা একটি বিন্দু ছাড়া)।


একটি সঠিক উত্তরের জন্য +1। উল্লেখ্য যে .!(@(|.))(এএএএফআইসিটি) উপরের সমতুল্য, (আইএমএনএসএইচএও) একটু পরিষ্কার, এবং কেবলমাত্র একটি অক্ষর দীর্ঘ।
স্কট

3

এই ধরনের ক্ষেত্রে এটির findপরিবর্তে ব্যবহারের পরামর্শ দেওয়া হবে cp:

find A/ -type f -maxdepth 1 -name '.*' -exec cp -p {} B/ \;

বেসিক সিনট্যাক্সটি এইভাবে ভেঙে যায়:

  • find A/ -type f: findডিরেক্টরিতে থাকা আইটেমগুলি A/যার ধরন ফাইল (ডিরেক্টরি পরিবর্তে)…
  • -maxdepth 1 -name '.*': এটির জন্য maxdepth1 টি ডিরেক্টরি এবং যার nameশুরু হয় .
  • -exec cp -p {} B/ \;: এবং একবার এই ফাইল পাওয়া যায়, একটি কমান্ড পতাকা তারিখ সংরক্ষণ / উৎস (থেকে বার গন্তব্য পর্যন্ত) ।execcp-p{}B/

আমি maxdepthনিয়ন্ত্রণের একটি স্তর যুক্ত করতে ব্যবহার করতে পছন্দ করি তাই আমি ঘটনাক্রমে পুরো ফাইল সিস্টেমটি অনুলিপি করছি না। তবে নির্দ্বিধায় এটি মুছে ফেলুন।


0
 for item in `find A -type d | grep -E "\."` ; do cp -r $item B ; done
  • find A -type d কেবলমাত্র ডিরেক্টরি সহ এ এর ​​মধ্যে একটি পুনরাবৃত্তির তালিকা সরবরাহ করে
  • grep -E "\." একটি বিন্দু দিয়ে ডিরেক্টরি ফিল্টার (যেমন: লুকানো ডিরেক্টরি)
  • -E বিকল্পটি এখানে প্রয়োজনীয় ছিল কারণ এটি ছাড়া এটির অর্থ "বর্তমান ডিরেক্টরি"
  • ব্যাকস্ল্যাশ হ'ল "কোনও চরিত্র" এর রেজিএক্সপ্যাক্ট এর অর্থ এড়ানো
  • cp -r পুনরাবৃত্তি কপি

আমি এ এর ​​জন্য ফাইল এবং ফোল্ডার কাঠামো তৈরি করেছি এবং গিট বাশে কমান্ডটি কার্যকর করেছি (আমি এখনই একটি লিনাক্স নিয়ে নেই) এবং এটি কাজ করে।


যদি ফাইলগুলির নাম বা পথে শ্বেত স্পেস বা বিশেষ অক্ষর থাকে তবে এটি ব্রেক হয়।

লক্ষ্য করার জন্য ধন্যবাদ :) আসলে @gaboroncancio দ্বারা আমি "পরীক্ষার ক্ষেত্রে" সীমাবদ্ধ। আপনি যদি আমাকে অন্য পরীক্ষার ব্যাটারি দিতে পারেন তবে আমি
সেটিকে

আপনি ডটফাইলগুলি কেবল একটি ফোল্ডারে কল A Bকরতে পারেন এবং তারপরে এটি অপ্রত্যাশিতভাবে কাজ করবে কারণ এটি প্রসারিত হবে cp -r A B/.dotfile B। সাধারণ পরামর্শটি মোটেই পার্স findবা lsআউটপুট নয়। আপনি যদি ব্যবহার করেন তবে findফিল্টারিংয়ের পরিবর্তে তার নিজস্ব বিকল্পগুলিও ব্যবহার করা উচিত grepএবং যদি আপনি findঅন্য কোথাও পাইপ আউট করেন তবে আপনার -print0যে আদেশটি চান তা ব্যবহার করুন বা সরাসরি কল করুন। find ম্যানুয়াল দেখুন ।
slhck

আরও সাধারণভাবে, ফাইলগুলির সাথে কাজ করার সময় অন্যান্য উত্তরে বর্ণিত শেল গ্লোবগুলি ব্যবহার করা সবচেয়ে নিরাপদ (যদিও তাদের প্রায়শই extglobসেট করা প্রয়োজন)।
slhck

লিঙ্কের জন্য ধন্যবাদ। এর findপরে পার্সিং ছেড়ে যাক ।
ম্যালারেস

0

বিকল্প হিসাবে আপনি এই অন্যান্য কমান্ডটি ব্যবহার করতে পারেন যদি দ্বিতীয় অক্ষর বর্ণানুক্রমিক ( উত্স ) হয়:

cp -r A/.[a-zA-Z0-9]* B

এটি প্রশ্নের মধ্যে দেওয়া উদাহরণস্বরূপ ফাইল এবং ডিরেক্টরিগুলির নামের জন্য কাজ করে , তবে প্রশ্নের পাঠ্যটি "লুকানো ফাইল এবং লুকানো সাব-ডিরেক্টরিগুলি (যেগুলি একটি বিন্দু দিয়ে শুরু করবে)" বলে, এবং এই উত্তরটি এমন ফাইল এবং ডিরেক্টরি খুঁজে পাবে না যার নাম দিয়ে শুরু হয় একটি বিন্দু এবং একটি বিশেষ চরিত্র; যেমন, .@fooবা ..c
স্কট

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