আমি বিন্দু দিয়ে শুরু করা ফাইলটি কীভাবে অনুলিপি করব?


26

আমি ডিরেক্টরি এ থেকে ডিরেক্টরি বি এর মধ্যে সমস্ত ফাইল অনুলিপি করার চেষ্টা করছি ডিরেক্টরি এ এর ​​অধীনে সমস্ত ফাইল ডট দিয়ে শুরু হচ্ছে, উদাহরণস্বরূপ:

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

যা আমি খুঁজে পেয়েছি যদি আমি ব্যবহার করি:, cp A/* Bসর্বদা ত্রুটি পান:

cp: cannot stat 'A/*': no such file or directory

মনে হচ্ছে সেখানে কোনো বিকল্প নেই cpযেমন lsডট দিয়ে শুরু হ্যান্ডেল এন্ট্রি, যে কেউ ধারণা কিভাবে এটি ঠিক করার আছে?

উত্তর:


34

কারণ হ'ল bash, *বিন্দু ( .) দিয়ে শুরু হওয়া ফাইলগুলি অন্তর্ভুক্ত করে না ।

আপনি চালাতে পারেন

cp A/.* B

এটি আপনাকে সতর্ক করবে যে এটি অনুলিপি করেছে .বা .., বা কোনও উপ-ডিরেক্টরিগুলি নয়, তবে এটি ঠিক আছে।

অথবা, আপনি যদি ডট ফাইল এবং সাধারণ ফাইলগুলি একসাথে অনুলিপি করতে চান তবে চালান

cp A/.* A/* B

আপনি চালাতে পারে

shopt -s dotglob
cp A/* B

যা কাজ করবে bash, কিন্তু হবে না sh

এবং যদি আপনি সাব-ডাইরেক্টরিগুলি খুব বেশি অনুলিপি করাতেও আপত্তি করেন না, তবে এটি সবচেয়ে সহজ:

cp -R A/ B

টিপ: যদি কখনও ওয়াইল্ডকার্ড আপনার প্রত্যাশা মতো না করে থাকে তবে এটিকে ইকো দিয়ে চালানোর চেষ্টা করুন

$ echo A/*
A/file1 A/file2

$ echo A/.*
A/. A/.. A/.hidden1 A/.hidden2

$ echo A/.* A/*
A/. A/.. A/.hidden1 A/.hidden2 A/file1 A/file2

$ shopt -s dotglob
$ echo A/*
A/file1 A/file2 A/.hidden1 A/.hidden2

আপনি যদি এটি ব্যবহার করেন তবে তা কেবল সমস্যা -r। ছাড়া -r, এটি কেবল ডিরেক্টরিগুলি এড়িয়ে যাবে।
মাইকেল

এবং আমি যে উদাহরণটি ব্যবহার করে দিচ্ছি তাও -Rঠিক কাজ করা উচিত। যদি আপনি এটি ভুল মনে করেন তবে দয়া করে কেন তা ব্যাখ্যা করুন।
মাইকেল

7

যদি বাশ, dotglobআপনি অনুলিপি করার আগে সেট করতে পারেন

shopt -s dotglob
cp A/* /destination

বা একটি প্রোগ্রামিং ভাষা

$ ruby -rfileutils -e  'Dir[".*"].each {|x| FileUtils.copy(x,"/destination") if File.file?x}'

আপনি যদি ডটগ্লোব সেট করতে না চান তবে ঠিক

cp A/.* /destination 2>/dev/null

ডটগ্লোব ওপিলিং ব্যবহার করে সমস্ত অ গোপনীয় ফাইলও অনুলিপি করা যায়, যা সে চায় না।
পেরো

@ পিওরো, আপনার আবার প্রশ্নটি পড়া উচিত। সমস্ত ফাইল Aলুকানো আছে। তিনি কেবল এটি অনুলিপি করতে চান।

7

আপনি যা সন্ধান করছেন সেটির লাইন ধরে আরও রয়েছে:

cp A/.??* B/

এটি সমস্ত ডটফিলের সাথে মিলবে তবে "নয়"। বা ".."। উপরের সমাধানগুলির বেশিরভাগগুলি ঠিক আছে যতক্ষণ না আপনি পুনরাবৃত্তভাবে কাজ করছেন না। তবে যত তাড়াতাড়ি আপনি কিছু করতে চান:

cp -R A/.??* B/

".." বাদ না দিয়ে আপনি ডাউন-ডটফাইলগুলি সহ নীচে নীচে থাকা মূল ডিরেক্টরি থেকে সমস্ত কিছু অনুলিপি করবেন।


1
এটি ডট-ফাইলগুলি মিস করবে যা একক অক্ষর, যেমন .aবা পছন্দ করে .x। সবচেয়ে কম globbing প্যাটার্ন আমি দেখেছি যে ম্যাচ ছাড়া প্রত্যেক ডট ফাইল .এবং ..হয় .[^.]*
প্যাভন


2

যে না cpএর দোষ ব্যাশ বিস্তৃতি: এটি ব্যাশ, *সব অ লুকানো (অর্থাৎ, অ শুরুর .) ফাইল।

বাশ প্রসারিত হবে .*(এইভাবে A/.*, আপনার ক্ষেত্রে) সমস্ত ফাইল দিয়ে শুরু হবে ., তবে দুর্ভাগ্যক্রমে এটিতে অন্তর্ভুক্ত রয়েছে .এবং ..(বর্তমান এবং মূল ডিরেক্টরিগুলি) যা আপনি সম্ভবত এড়াতে চান। (নোট করুন যে zsh এর মতো অন্যান্য শেলগুলি এগুলিকে অন্তর্ভুক্ত করবে না এবং আইআইআরসিও কিছু বিকল্প নির্ধারণের পরে ব্যাশ করবে)।

এর মতো একটি (খুব) হ্যাকি উপায়ে মেলানো ফাইলগুলি মুছে ফেলা .এবং ..থেকে সরিয়ে ফেলা সহজ সমাধান হতে পারে .*:

cp $( for F in A/.*; do echo $F | grep -v "^\.*$"; done ) B

বা এটির একটি (সম্ভবত ক্লিনার: এটি findঅনুলিপি করতে ফাইলগুলি সন্ধান করতে ব্যবহার করে):

cp $( find A -maxdepth 1 -mindepth 1 -name ".*" ) B

তবে আপনি সম্ভবত ক্লিনার সমাধান খুঁজে পাবেন।


কেন আপনি একটি ব্যবহার করবেন for loopএবং তারপরে grepএকটি কাজ করার মতো অতিরিক্ত প্রক্রিয়া তৈরি করবেন cp A/.*? cp"এড়ানো হবে।" এবং ".." ডিরেক্টরিগুলি।

1

যদি সেগুলি সমস্ত বিন্দু দিয়ে শুরু করে তবে কেবল ব্যবহার করুন A/.*:

[holt@Michaela test]$ cp A/* B
cp: cannot stat `A/*': No such file or directory

[holt@Michaela test]$ cp A/.* B
cp: omitting directory `A/.'
cp: omitting directory `A/..'
[holt@Michaela test]$ ls -al B
total 8
drwxrwxr-x. 2 holt holt 4096 2011-03-31 16:57 .
drwxrwxr-x. 4 holt holt 4096 2011-03-31 16:57 ..
-rw-rw-r--. 1 holt holt    0 2011-03-31 16:57 .a
-rw-rw-r--. 1 holt holt    0 2011-03-31 16:57 .b
-rw-rw-r--. 1 holt holt    0 2011-03-31 16:57 .c

আশাকরি এটা সাহায্য করবে!


1

আপনি এই স্ক্রিপ্ট ব্যবহার করতে পারেন

আইএফএস = $ '\ n'; act তে অভিনয় করার জন্য (এ-ডি -1 সন্ধান করুন); সিপি -আর "$ আইন" বি; সম্পন্ন


0

কপি করুন:

cp A/.* B

তালিকা:

ls -l A/.*

অবতরণ ডিরেক্টরি ছাড়া ফাইল তালিকা:

ls -ld A/.*

0

আপনাকে অবশ্যই বাদ দিতে হবে। এবং .. ফাইল তালিকা থেকে সিপিতে পাস!

এটি নিরাপদ:

ls -1d A/.[a-zA-Z]* | xargs -i cp -rp {} B

0

এটি একটি পুরানো থ্রেড ... তবে আমি সবসময় সমস্ত ফাইল অনুলিপি করতে সক্ষম হয়েছি। '/' দিয়ে শুরু হওয়া ফাইল / ফোল্ডার সহ।

উদাহরণ সমস্ত ফাইল এবং ফোল্ডার অনুলিপি করবে:

সিপি-আউপ / রুট /.* / ব্যাকআপ / রুট /

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