গ্লোব নিদর্শন সহ সিপি লুকানো ফাইল


13

পরিস্থিতি :

$ mkdir foo && touch foo/.test
$ cp foo/* .
zsh: no matches found: foo/*
(or bash : cp: cannot stat foo/*’: No such file or directory)

আমার কাছে লুকানো ফোল্ডার এবং ফাইলগুলি পূর্ণ একটি ডিরেক্টরি রয়েছে। কী হচ্ছে এবং এর সমাধান কী?


dotglobথেকে অনুবাদ করা হয় globdotsদ্বারা zsh যার জন্য অবৈধ বিকল্প নাম ব্যাশ

উত্তর:


19

দাবি অস্বীকার: এই উত্তরটি বিশেষত ব্যাশের সাথে কাজ করে তবে এর বেশিরভাগ অংশ বিশ্বব্যাপী নিদর্শন সম্পর্কিত প্রশ্নে প্রযোজ্য!

তারকা চরিত্রটি ( *) একটি ওয়াইল্ডকার্ড। অক্ষরগুলির একটি নির্দিষ্ট সেট রয়েছে যা এটির স্থান গ্রহণ করবে এবং প্রথম অক্ষরটি বিন্দু হওয়া ( .) সেগুলির মধ্যে একটি নয়। ইউনিক্স ফাইল সিস্টেমগুলি কীভাবে কাজ করে, ডট দিয়ে শুরু হওয়া ফাইলগুলিকে "লুকানো" হিসাবে বিবেচনা করা হয় তার কারণে এটি একটি বিশেষ ক্ষেত্রে। যে যেমন টুলস মানে cp, lsইত্যাদি না তাদের "দেখুন" হবে না যদি না স্পষ্টভাবে তা করার কথা বলেন।

উদাহরণ

প্রথমে কিছু নমুনা ডেটা তৈরি করা যাক।

$ mkdir .dotdir{1,2} regdir{1,2}
$ touch .dotfile{1,2} regfile{1..3}

সুতরাং এখন আমাদের নিম্নলিখিত আছে:

$ tree -a
.
|-- .dotdir1
|-- .dotdir2
|-- .dotfile1
|-- .dotfile2
|-- regdir1
|-- regdir2
|-- regfile1
|-- regfile2
`-- regfile3

এবার কিছু গেম খেলি। echoনির্দিষ্ট কমান্ডের জন্য নির্দিষ্ট ওয়াইল্ডকার্ড ( *) কী হবে তা নির্ধারণ করতে আপনি কমান্ডটি ব্যবহার করতে পারেন :

$ echo *
regdir1 regdir2 regfile1 regfile2 regfile3


$ echo reg*
regdir1 regdir2 regfile1 regfile2 regfile3

$ echo .*
. .. .dotdir1 .dotdir2 .dotfile1 .dotfile2

$ echo .* *
. .. .dotdir1 .dotdir2 .dotfile1 .dotfile2 regdir1 regdir2 regfile1 regfile2 regfile3

$ echo .dotdir*
.dotdir1 .dotdir2

আচরণ বদলাচ্ছে?

আপনি shopt -s dotglobআচরণটি পরিবর্তন করতে কমান্ডটি ব্যবহার করতে পারেন *যাতে regfile1এটির মতো ফাইলগুলির সাথেও এটি মেলে .dotfile1

bashম্যান পৃষ্ঠা থেকে উদ্ধৃতি

dotglob If set, bash includes filenames beginning with a `.' in the results 
        of pathname expansion.

উদাহরণ:

$ shopt -s dotglob
$ echo *
.dotdir1 .dotdir2 .dotfile1 .dotfile2 regdir1 regdir2 regfile1 regfile2 regfile3

আপনি এই আদেশের সাহায্যে এই আচরণটি ফিরিয়ে দিতে পারেন:

$ shopt -u dotglob
$ echo *
regdir1 regdir2 regfile1 regfile2 regfile3

আপনার অবস্থা?

আপনি বলছেন cpযে আপনি প্যাটার্নের সাথে মেলে এমন সমস্ত ফাইল অনুলিপি করতে চান *, এবং কোনও ফাইল নেই n't

$ cp foo/.* .

অথবা আপনি যদি fooফোল্ডারে সবকিছু চান তবে এটি করতে পারেন :

$ cp foo .

অথবা আপনি স্পষ্ট করে বলতে পারেন:

$ cp foot/.* foo/* .

ব্রেস প্রসারণ ব্যবহার করে আরও কমপ্যাক্ট ফর্ম bash:

$ cp foo/{.,}* .

echoআপনার প্রস্তাবিত ফাইলের ধরণগুলি কী তা দেখতে আপনি যে কোনও সময় কৌশলটি ব্যবহার করতে পারেন (এটি তারার একটি অংশের অভিনব শব্দ)।

$ echo {.,}*
. .. .dotdir1 .dotdir2 .dotfile1 .dotfile2 abc regdir1 regdir2 regfile1 regfile2 regfile3

ঘটনাচক্রে আপনি যদি ফাইল + অন্যান্য ডিরেক্টরিগুলির একটি ডিরেক্টরি অনুলিপি করতে চলেছেন তবে আপনি সাধারণত এটি পুনরাবৃত্তভাবে করতে চান, এটি -Rস্যুইচ করুন cp:

$ cp -R foo/. .

1
আপনি এর ব্যবহারটি উল্লেখ করতে চাইতে পারেন shopt -s dotglob, echo *তারপরে দেয়:.dotdir1 .dotdir2 .dotfile1 .dotfile2 regdir1 regdir2 regfile1 regfile2 regfile3
ড্রইং স্লোয়ান

@ ড্রাভস্লোয়ান - এই পরামর্শের জন্য ধন্যবাদ। এটি যুক্ত।
slm

cp -r foo .সাধারণত কাজ করবে না যেহেতু নিজেই cpঅনুলিপি করতে অস্বীকার করবে foo, সম্ভবত আপনি বোঝাতে চেয়েছিলেন cp -R foo/. .। (নোট cp -Rএটি মানক)
স্টাফেন চেজেলাস

1
এছাড়াও মনে রাখবেন (বেশ বুদ্ধিমানের মতো), zshঅন্তর্ভুক্ত নয় .এবং ..প্রসারে .*। ইন zsh, যদি কোনও প্যাটার্নটি মেলে না, কমান্ডটি বাতিল করা হয়েছে (বেশ সংবেদনশীলভাবে আবার), তাই সাধারণ ক্ষেত্রে, cp foo/{,.}* .কোনও গোপনীয়তা না থাকলে বা গোপনীয় কোনও ফাইল না থাকলে ব্যর্থ হবে will
স্টাফেন চেজেলাস

7
এই উত্তরটি কেবল ব্যাশের ক্ষেত্রে প্রযোজ্য। প্রশ্নকর্তা zsh ব্যবহার করছেন, যেখানে উত্তরটি অনেক সহজ এবং shoptঅস্তিত্ব নেই।
গিলস

31

এর সাথে zsh, সাধারণ উপায় হ'ল D গ্লোব কোয়ালিফায়ার ব্যবহার করা ([ডি] ওটি ফাইল অন্তর্ভুক্ত করা):

cp foo/*(D) .

মনে রাখবেন যে Dজেডশ গ্লোবগুলি কখনই বা এর বাইরে থাকে .না ..(যেমনটি আপনি আশা করেছিলেন) include


4

শেলটি সেই ফাইলগুলিকে লুকানো হিসাবে বিবেচনা করে যখন *অক্ষরটি সমাধান হয় , সুতরাং cpএই ফাইলগুলির কোনও নাম আর্গুমেন্ট হিসাবে গ্রহণ করে না।

আপনি এগুলি স্পষ্ট করে নির্দিষ্ট করে কপি করতে পারেন cp foo/.* .


1

আপনি যা করতে চাইছেন তা যদি সমস্ত ফাইল এবং ডিরেক্টরিগুলি এক জায়গা থেকে অন্য জায়গায় অনুলিপি করে থাকে তবে আপনি স্ট্যান্ডার্ড rsyncকমান্ডটি ব্যবহার করতে পারেন । উদাহরণস্বরূপ আপনি উপরে দিয়েছেন:

mkdir foo && touch foo/.test
rsync -a foo/ .

fooলুকানো ফাইল এবং লুকানো ডিরেক্টরি সহ সমস্ত সামগ্রীর পুনরাবৃত্তভাবে বর্তমান ডিরেক্টরিতে অনুলিপি করবে । শেষের দিকে পিছনের foo/স্ল্যাশটি RSSync করা গুরুত্বপূর্ণ; এটির সাথে কেবলমাত্র লিখিত সামগ্রীগুলি fooঅনুলিপি করা হয়, এটি ছাড়া আরএসসিএনসিও অনুলিপি করে foo। উদাহরণ স্বরূপ:-

mkdir src && mkdir dest && touch src/.test
rsync -a src  dest    // copies 'src' contents to 'dest/src'
rsync -a src/ dest    // copies 'src' contents to 'dest' 

মেশিনের মধ্যে অনুলিপি সহ আরও অনেক অপশন উপলভ্য টুইঙ্ক আরএসসিএনসি রয়েছে।


1

স্টাফেন চেজেলাসের জেএসএস উত্তরটি একটি গ্লোবযুক্ত একক অভিব্যক্তির জন্য সঠিক। তবে আপনি যদি এটি ডিফল্টরূপে সমস্ত এক্সপ্রেশনের জন্য সেট করতে চান তবে আপনি ব্যবহার করতে পারেন

setopt GLOB_DOTS

~/.zshrcএটি স্থায়ী করার জন্য এটি আপনার মধ্যে রাখুন ।

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