লুকানো ফাইলগুলি সরানোর জন্য আমি কীভাবে এমভি (বা * ওয়াইল্ডকার্ড) পেতে পারি?


133

আমি আমার হোম ডিরেক্টরিটি একটি পুরানো সিস্টেম থেকে নতুন একটিতে স্থানান্তরিত করছি, এবং আমার তৈরি টার্বালটিতে .bashrc এর মতো লুকানো ফাইলগুলি সহ সমস্ত কিছুই রয়েছে। যাইহোক, আমি যখন আনপ্যাকড টারবালের সামগ্রীগুলি (যা / টেম্পে রয়েছে) আমার নতুন হোম ডিরেক্টরিতে স্থানান্তরিত করি, লুকানো ফাইলগুলি ( mv /tmp/home/rcook/* /home/rcook/) অনুলিপি করে না । আমি কীভাবে এগুলি সরাতে এমভি পেতে পারি?

আসলে, আমি মনে করি সমস্যাটি এমভি নিয়ে নয়, বাশের গ্লোববিংয়ের সাথে। আমি যদি এটি করি:

mkdir a
mkdir b
touch a/.foo
touch a/bar
mv a/* b/
ls -a a/ b/

আমি এটা দেখি:

a/:
.  ..  .foo

b/:
.  ..  bar

a/.fooসরেনি। সুতরাং আমি কীভাবে লুকানো ফাইলগুলি খুঁজে পেতে * ওয়াইল্ডকার্ড পেতে পারি?

হ্যাঁ, আমি মনে করি যে আমি টারবালটি সরাসরি আমার হোম ডিরেক্টরিতে সংক্রামিত করতে পারতাম, তবে টারবালটি সংকোচিত হয়ে যায় home/rcook/...এবং আমি নিশ্চিত হতে চাই যে আমি .bashrcপুরানো, কাস্টমাইজড সংস্করণগুলির সাহায্যে নতুন ইত্যাদি মুছে ফেলব এবং কীভাবে লুকানো ফাইলগুলি সন্ধান করতে এবং স্থানান্তরিত করতে হবে তা জানতাম knowing একটি সার্থক দক্ষতা। পরামর্শ?


কিছু উত্তর কিছু ভালো করার পরামর্শ দেয় mv src/.* dest/। যাইহোক, আমি আমার পরীক্ষার ডিরেক্টরিতে এটি চেষ্টা করেছি এবং ত্রুটি পেয়েছি। দিয়ে শুরু:

rcook$ ls -a a/ b/
a/:
.  ..  bar  .foo

b/:
.  ..
rcook$ mv a/.* b/
mv: cannot move 'a/.' to 'b/.': Device or resource busy
mv: cannot remove 'a/..': Is a directory
rcook$ ls -a a/ b/
a/:
.  ..  bar

b/:
.  ..  .foo

আমি কি ভুল করছি?


উত্তর:


146

তুমি এটি করতে পারো :

shopt -s dotglob
mv /tmp/home/rcook/* /home/rcook/

তুমি রাখতে পারো

shopt -s dotglob

আপনার ~/.bashrcযদি এটি ডিফল্ট হতে চান।

Http://mywiki.wooledge.org/glob দেখুন


ডট ফাইলগুলি অনুলিপি করার জন্য অন্য পদ্ধতি:

mv /tmp/home/rcook/.[!.]* /home/rcook/

এটি প্যাটার্নটি ..*মেলে হিসাবে ব্যবহার করবেন না ..(প্যারেন্ট ডিরেক্টরিটিতে পয়েন্টার)। যদি এমন কোনও ফাইল থাকে যার নাম দুটি বিন্দু ( ..something) দিয়ে শুরু হয় , তবে প্যাটার্নটিও ব্যবহার করুন ..?*


আমার প্রশ্নের নীচে আমি সংযোজনগুলি যুক্ত করে দেখুন। ধন্যবাদ।
রেন্ডাল কুক

1
কিছু ভুল নেই, .এবং ..বিশেষায়িত ডায়ারগুলি: যথাক্রমে বর্তমান দির এবং পিতামহীন ডিয়ার । এটি কেবল একটি সতর্কতা। আরও ভাল ব্যবহারের shopt -s dotglobসমাধান
গিলস কুইনট

আমি মাত্র দুটি চালনা শেষ করেছিলাম: mv home/rcook/* /home/rcook/তারপরে mv home/rcook/.* /home/rcook/। এটি কৌশলটি করেছে, যদিও আমি ইচ্ছা করি আমি লিঙ্কটি অনুসরণ করে ডটগ্লোব মোডটি প্রথমে পড়তাম read এটি আমাকে একটি পদক্ষেপ বাঁচাতে পারত। +1
র্যান্ডল কুক

সুতরাং দ্বিতীয় পদ্ধতির জন্য নিখুঁত পাথের ব্যবহার প্রয়োজন?
ফ্র্যানজ্লোরেঞ্জন

3
আপনি ব্যবহার করেন, তাহলে zsh, আপনি ব্যবহার করতে পারেন globbing কোয়ালিফায়ার বা শেল বিকল্পDGLOB_DOTS
ম্যাগেলস

43

আপনার সংযোজনগুলিতে, আপনি ত্রুটি পেয়েছিলেন তবে কোডটি এখনও কাজ করে। যুক্ত করার একমাত্র জিনিস আপনি এটি কেবল ডট ফাইলগুলি অনুলিপি করতে বলেছিলেন । চেষ্টা করুন:

mv src/* src/.* dst/

আপনি এখনও এর জন্য ত্রুটি পাবেন। এবং .. এন্ট্রি, যা ভাল। তবে পদক্ষেপটি সফল হওয়া উচিত।

~/scratch [andrew] $ mv from/* from/.* to/
mv: cannot move from/.’ to to/.’: Device or resource busy
mv: cannot remove from/..’: Is a directory
~/scratch [andrew] $ ls -a from/ to/
from/:
.  ..

to/:
.  ..  test  .test

1
ভাল পয়েন্টস, @ অ্যান্ড্রুশওয়ার্টজ। আমিও এই পদ্ধতিটি পছন্দ করি। আমি মনে করি এটি আরও স্বীকৃতির দাবিদার।
র্যান্ডাল কুক

আমি @ ড্রেক ক্লারিসকে আরও কিছু উত্তর দিতে চাই, কারণ আমি অ্যামাজন এডাব্লুএস কোডবিল্ডে চালিয়ে যাচ্ছি এবং নন জিরো রিটার্ন কোডটি আসলে আমার বিল্ডটি বন্ধ করে দিয়েছে। .hiddenযদিও আমার সমস্যাটি সমাধান করার জন্য আমি স্পষ্টতই একটি ফাইল সরিয়ে নিয়েছি।
আরেওয়াচ এই

শূন্য-বহির্গমন প্রস্থান কোড যদি কোনও সমস্যা হয় তবে আপনি এটিকে দমন করতে পারেন, উদাহরণস্বরূপ সংযোজন || :( ||অর্থ মিথ্যা / ত্রুটির ভিত্তিতে নিম্নলিখিতটি কার্যকর করা, :নূপ আদেশ)। তবে এটি বৈধ ত্রুটিগুলিও দমন করতে পারে, যেমন গন্তব্য ফোল্ডারটি বিদ্যমান নেই। আমি এবং এন্ট্রিগুলি mvবাদ দেওয়ার জন্য আরও মার্জিত উপায় খুঁজে পাচ্ছি না । সিপি ওভার বাট বড় প্লাস ডিস্কে নতুন ফাইল লিখছে না। ...
অ্যান্ড্রু শোয়ার্টজ

10

আপনি ls -lযদি কোনও ডিরেক্টরিতে থাকেন তবে আপনি দেখতে পাবেন .এবং ..তালিকাবদ্ধ ফাইলগুলির মধ্যে রয়েছেন। সুতরাং, আমি মনে করি mv .* /destএই পয়েন্টারগুলিকে অ্যাকাউন্টে নেয়। চেষ্টা করুন:

mv /tmp/home/rcook/{*,.[^.]*,..?*} /home/rcook/

এটি বর্তমান এবং পিতামাতার দির পয়েন্টারগুলিকে উপেক্ষা করবে।

আপনি তিনটি রীতির যদি থাকে একটি ত্রুটি পাবেন *, [^.]*বা ..?*কোন ফাইল মিলে যায়, তাই আপনি শুধুমাত্র বেশী মেলে অন্তর্ভুক্ত করা উচিত।


খুশী হলাম। গ্লোব্বিংয়ের এই স্টাইলের জন্য অনুরূপ উত্তরটি এখানে রয়েছে: superuser.com/a/784046/144977 । এই পোস্ট করার জন্য ধন্যবাদ।
ফায়াত

7

দুটি সম্ভাব্য সমাধান যা আমি ভাবতে পারি। প্রথমটি হ'ল সিপি এর পরিবর্তে তার পুনরাবৃত্তির বিকল্পটি ব্যবহার করে বর্তমান ডিরেক্টরিটি গন্তব্যে অনুলিপি করে।

cp -Rp . /desired/directory

তারপরে আপনি বর্তমান ডিরেক্টরিতে উত্স ফাইলগুলি মুছতে পারেন

বিকল্পভাবে, আপনি যদি জানেন যে ফাইলগুলির নামকরণ করা হয়েছে (কোনও স্পেস, ওয়াইল্ডকার্ডস, প্রিন্টযোগ্য অক্ষর নেই) তবে আপনি এটির মতো কিছু করতে পারেন

mv $(ls -A) /desired/directory

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

2

লিনাক্সে "লুকানো" ফাইলের মতো জিনিস আসলেই নেই। ডট দিয়ে শুরু হওয়া ফাইলগুলি কেবলমাত্র ডিফল্টরূপে ফাইল তালিকা থেকে গোপন থাকে।

এমনকি একটি গ্লোব দিয়ে ফাইলগুলি অনুলিপি করতে, আপনার .যেমন ফাইলের উপসীকরণ করতে হবে mv -u .* fooএবং তারপরে যখন স্থানান্তরিত .fooহবে তখন উপস্থিত হবে foo/.foo

সোর্সটি নতুন থাকাকালীন, বা গন্তব্য অনুপস্থিত থাকলে -u বিকল্পটি কেবল ফাইলগুলিকে সরিয়ে ফেলবে। অথবা আপনি সরানোর বিষয়ে ত্রুটিগুলি কেবল এড়িয়ে যেতে পারেন .এবং ..সেগুলি বিশেষ ফাইল এবং সরানো যায় না, তবে .*শেলটি দিয়ে গ্লোবতে ধরা পড়ে না ।


আমার প্রশ্নের নীচে আমি সংযোজনগুলি যুক্ত করে দেখুন। ধন্যবাদ।
রেন্ডাল কুক

0

তাহলে আমাদের আছে:

a
|-- .foo
`-- bar

এবং:

b

আমি এখানে সমস্ত উত্তর চেয়ে ভাল সমাধান খুঁজতে একটি বিশাল সময় নিয়েছে ।

তারপরে আমি এই আদেশটির জন্য 30 সেকেন্ড সময় নিয়েছি :

$ mv --help

তারপর আমি আমার ভালবাসা খুঁজে পেয়েছি:

$ mv a/ b/ -T

দ্রষ্টব্য: আমি তর্কটিও বুঝতে পারি না -T। এটি কেবল আমার যা প্রয়োজন তা করেছে। এখানে এটি বলা হয়েছে:

-টি, --no-টার্গেট-ডিরেক্টরি DEST কে একটি সাধারণ ফাইল হিসাবে বিবেচনা করে


1
যদি আপনি স্ল্যাশগুলি বাদ দেন তবে আপনার প্রয়োজন হবে না -T। যে কোনও উপায়ে এটি মূলত mv কে ডিরেক্টরিটি সরিয়ে আনতে বলছে না বরং এর মধ্যে থেকে সমস্ত ফাইল সরিয়ে নেওয়া।
থোমাসর্টটার

@ থোমাস্রুটটার, ডিরেক্টরিটিকে পুনরায় নামকরণ করার মতো একই জিনিসটিকে সরানো হচ্ছে না?
রেন্ডাল কুক

3
হ্যাঁ, যদি প্যারেন্ট গন্তব্য একই থাকে তবে এটি মূলত কেবল এটির নাম পরিবর্তন করে। তবে আপনি এটি উল্লেখ করুন, সম্ভবত এটি মূল প্রশ্নের উত্তর দিতে সহায়তা করবে না, যা ডিরেক্টরিটির ভিতরে থাকা ফাইলগুলিকে একটি নির্দিষ্ট জায়গায় সরিয়ে দেওয়ার বিষয়ে ছিল ।
থোমাসর্টটার

0

আমার ক্ষেত্রে আমি কেবল mvএকটি একক লুকানো ফাইল চেষ্টা করছিলাম এবং এটিই সমাধান:

FILE=.myHiddenFile
mv "$FILE" dest/

ব্যাখ্যা

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

mv .myHiddenFile dest/

তবে এটি ত্রুটি তৈরি করে চলেছে:

mv: cannot stat '.myHiddenFile': No such file or directory

যদিও একটি ls -alফাইল দেখিয়েছে এবং dest/বিদ্যমান ছিল।

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


-1

আপনি যদি বর্তমান ডিরেক্টরিটিতে লুকানো ফাইলগুলি সহ ফাইলগুলি অনুলিপি করতে চান তবে।

cp -Rp source-directory/. .

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