কীভাবে * মাধ্যমে লুকানো ফাইল সহ সমস্ত ফাইল প্যারেন্ট ডিরেক্টরিতে স্থানান্তরিত করবেন


113

এটি অবশ্যই একটি জনপ্রিয় প্রশ্ন হতে পারে তবে আমি কোনও উত্তর পাই না।

লুকানো ফাইলগুলি সহ সমস্ত ফাইলকে কীভাবে প্যারেন্ট ডিরেক্টরিতে স্থানান্তরিত করবেন:

mv /path/subfolder/* /path/

এটি প্রত্যাশার মতো সমস্ত ফাইলকে প্যারেন্ট ডিরেক্টরিতে স্থানান্তরিত করবে তবে লুকানো ফাইলগুলিতে সরবে না। কিভাবে যে কি?


1
এই প্রশ্নের আরও একটি সঠিক উত্তর সহ এসইউতে একটি সদৃশ রয়েছে (যদিও স্বীকৃত উত্তর নেই): cp -r /path/to/source/. /destination
ফ্লোরিয়ান

উত্তর:


202

আপনি ইউনিক্স এবং লিনাক্সের উত্তরটিতে এর একটি বিস্তৃত সমাধান পেতে পারেন আপনি কীভাবে সমস্ত ফাইল (গোপন সহ) একটি ডিরেক্টরি থেকে অন্য ডিরেক্টরিতে স্থানান্তর করবেন? । এটি বাশ, zsh, ksh93, স্ট্যান্ডার্ড (POSIX) sh ইত্যাদিতে সমাধান দেখায়


আপনি এই দুটি কমান্ড একসাথে ব্যবহার করতে পারেন:

mv /path/subfolder/* /path/   # your current approach
mv /path/subfolder/.* /path/  # this one for hidden files

বা সমস্ত একসাথে ( ধন্যবাদ pfnuesel ):

mv /path/subfolder/{.,}* /path/

যা প্রসারিত:

mv /path/subfolder/* /path/subfolder/.* /path/

(উদাহরণ: echo a{.,}bপ্রসারিত a.b ab)

নোট এটি কয়েক সতর্কতা প্রদর্শন করবে:

mv: cannot move ‘/path/subfolder/.’ to /path/.’: Device or resource busy
mv: cannot remove /path/subfolder/..’: Is a directory

কেবল তাদের উপেক্ষা করুন: এটি ঘটে কারণ /path/subfolder/{.,}*এটিও প্রসারিত হয় /path/subfolder/.এবং /path/subfolder/..যা ডিরেক্টরি এবং মূল ডিরেক্টরি ( কোনও ফোল্ডারে থাকাকালীন "।" এবং ".." অর্থ কী? )।


আপনি যদি কেবল অনুলিপি করতে চান তবে আপনি নিছক ব্যবহার করতে পারেন:

cp -r /path/subfolder/. /path/
#                     ^
#                     note the dot!

এটি /path/subfolder/."এই ডিরেক্টরি থেকে সমস্ত কিছু" পর্যন্ত প্রসারিত হওয়ার পরে এটি স্বাভাবিক এবং লুকানো উভয় ফাইলই অনুলিপি করবে (উত্স: লুকানো ফাইল এবং লুকানো ডিরেক্টরি এবং তাদের বিষয়বস্তু অন্তর্ভুক্ত করতে সিপি দিয়ে কীভাবে অনুলিপি করবেন? )


2
ধনুর্বন্ধনীগুলি কেবল একটি শর্ট কাট mv /path/subfolder/* /path/subfolder/.* /path/, দুটি কমান্ড একসাথে একত্রিত করার জন্য কঠোরভাবে প্রয়োজন হয় না।
চিপনার

7
আমি নিম্নলিখিত ত্রুটিটি পেয়েছি:mv: overwrite `/path/.'? y mv: cannot move `/path/subfolder/.' to `/path/.': Device or resource busy mv: overwrite `/path/..'? y mv: cannot move `/path/subfolder/..' to `/path/..': Device or resource busy
দেজন

@ দেজন কেবল এটি উপেক্ষা করুন .বর্তমান ডিরেক্টরিকে ..নির্দেশ করে এবং upডিরেক্টরিকে নির্দেশ করে । আপনি অবশ্যই লক্ষ্য করেছেন যে অন্যান্য সমস্ত ফাইল সরানো আছে।
দেবিপ্রসাদ

ওয়ার্থ উল্লেখ ধনুর্বন্ধনী হবে শর্টকাট সব শাঁস জন্য কাজ নয়, কিন্তু @chepner কমান্ড আমি মনে করি যে এটা করবে না
জেসুস Carrera

7
"কেবল সতর্কতা উপেক্ষা করুন" সর্বদা ভাল ধারণা হতে পারে না। এই মুহুর্তে আমার একটি স্ক্রিপ্ট নিয়ে সমস্যা হচ্ছে যার মধ্যে কোনও পদক্ষেপ ব্যর্থ হলে আমার কার্যকর করা বন্ধ করতে হবে - যেহেতু এই সমাধানটি সর্বদা একটি ত্রুটির কারণ হয়ে থাকে, এটি আমার স্ক্রিপ্টটিকে মেরে ফেলে। আমার
এমভি

29

আমি মনে করি এটি সর্বাধিক মার্জিত, কারণ এটি সরানোর চেষ্টাও করে না ..:

mv /source/path/{.[!.],}* /destination/path

1
হ্যাঁ আমি লক্ষ্য করেছি যে এটি ত্রুটি বার্তাগুলিও দিচ্ছে, খুব ভাল।
জোসেফ আস্ট্রাহান

আমি মনে করি এটি একটি খুব ভাল সমাধান তবে এটি সেই ধরণটি মনে রাখা খুব কঠিন
ডিলান বি

ভালো ফাইল মিস্ হবে ..anythingবা ...anythingইত্যাদি - stackoverflow.com/a/31438355/2351568 এই সমস্যার জন্য সঠিক Regex ধারণ করে। || তবে যাইহোক ব্যবহার shopt -s dotglobকরা আরও ভাল সমাধান!
ডিজে ক্র্যাশডমি

@ ডিলানবি এটি মুখস্ত করবেন না। মনে রাখবেন এটি কমা দ্বারা পৃথককৃত কার্লব্রিকেটগুলির সাথে যা কিছু মিলছে। {a,b}*"এনাটমি" এবং "বুলডোজার" এর মতো একটি বা বি দিয়ে শুরু হওয়া সমস্ত ফাইল খুঁজে পাওয়া যাবে। দ্বিতীয় ম্যাচটি একটি খালি ম্যাচ, সমতুল্য *এবং প্রথম ম্যাচটি সমান .[!.], যেখানে গ্রুপ [!.]মানে একটি গ্রুপ নয় যার সাথে শুরু হয় .। এর অর্থ .*কিন্তু নয় ..*
mazunki

28

এটি প্রত্যাশার মতো সমস্ত ফাইলকে প্যারেন্ট ডিরেক্টরিতে স্থানান্তরিত করবে তবে লুকানো ফাইলগুলিতে সরবে না। কিভাবে যে কি?

আপনি চালু করতে পারেন dotglob:

shopt -s dotglob               # This would cause mv below to match hidden files
mv /path/subfolder/* /path/

বন্ধ করার জন্য dotglob, আপনাকে বলতে হবে:

shopt -u dotglob

খুব উপকারী. আরও জানতে চেয়েছিলেন তবে শপ্ট একটি অন্তর্নির্মিত তাই man shoptকাজ করে না এবং help shoptখুব সংক্ষিপ্ত। তবে আপনি এটি করতে পারেন bashman () { man bash | less -p "^ $1 "; }এবং তারপরে bashman shoptএটি সম্পর্কে সোজাসুজি পড়তে পারেন। (ঢ আঘাত কমান্ড নিচে ঝাঁপ যদি shopt দিয়ে শুরু লাইন আছে হিসাবে আমি পাওয়া থাকতে পারে,।)
নিক রাইস

2
এটি অন্যান্য সমস্ত কমান্ডের ls
মতোও

5

বিকল্প সহজ সমাধানটি rsyncইউটিলিটি ব্যবহার করা :

sudo rsync -vuar --delete-after --dry-run path/subfolder/ path/

দ্রষ্টব্য: উপরের কমান্ডটি কী পরিবর্তন হতে চলেছে তা দেখিয়ে দেবে। আসল পরিবর্তনগুলি কার্যকর করতে, সরান--dry-run

সুবিধাটি হ'ল মূল ফোল্ডারটি ( subfolder)টি কমান্ডের অংশের পাশাপাশি মুছে ফেলা হবে এবং mvএখানে উদাহরণগুলি ব্যবহার করার সময় আপনার ফোল্ডারগুলি পরিষ্কার করা দরকার, একক মধ্যে লুকানো এবং গোপনীয় ফাইলগুলি coverাকতে অতিরিক্ত মাথাব্যথা উল্লেখ করা উচিত নয় প্যাটার্ন।

এ ছাড়া rsyncরিমোটগুলির মধ্যে ফাইলগুলি অনুলিপি / সরিয়ে দেওয়ার জন্য সমর্থন সরবরাহ করে এবং এটি নিশ্চিত করে যে ফাইলগুলি মূলত ( -a) এর মতোই অনুলিপি করা হয়েছিল ।

ব্যবহৃত -uপ্যারামিটার বিদ্যমান নতুন ফাইলগুলি এড়িয়ে যেত, -rডিরেক্টরিগুলিতে পুনরাবৃত্তি -vহত এবং ভারবোসিটি বাড়িয়ে তুলত।


সর্বকালের সেরা সমাধান! আমার ক্ষেত্রে আমি -u প্যারামিটারটি সরিয়েছি, কারণ আমি রুট ফোল্ডারটি আপডেট করতে চাই না। ধন্যবাদ
থ্যালস সিওলিন

এটি সেই কমান্ডগুলির মধ্যে একটি যেখানে আপনি সতর্কতা অবলম্বন না করলে আপনি লিনাক্সে স্থায়ীভাবে নিজের জন্য জিনিসগুলি গুছিয়ে নিতে পারেন। দয়া করে rsync কমান্ডের আগে sudo অন্তর্ভুক্ত করার জন্য আপনার উত্তরটি আপডেট করুন, অন্যথায়, ব্যবহারকারীরা সহজেই mkdir এর জন্য অনুমতি অস্বীকার করতে পারেন, তবে ফাইল মুছে ফেলা সত্ত্বেও এগিয়ে যাবে, সুতরাং, আরএসসিএনসি কমান্ড আপনার সরানো ডিরেক্টরিটি মুছে ফেলবে এবং অন্য কিছু করবে না । আপনি আপনার পুরো ডিরেক্টরিটি হারাবেন। আপনি একবার আপনার উত্তরে sudo যুক্ত করলে এটি সম্ভবত গ্রহণযোগ্য উত্তর হওয়া উচিত। সুতরাং কমান্ডটি হ'ল: sudo rsync -vuar - নির্ধারিত পথ / সাবফোল্ডার / পাথ /
ব্লু ওয়াটার

@ জোহনিবি অসুবিধার জন্য দুঃখিত। আমি যোগ করেছি sudoএবং --dry-run, যাতে লোকেরা কোনও সম্ভাব্য গোলযোগ এড়াতে প্রকৃত কমান্ড চালানোর আগে পরিবর্তনগুলি পরীক্ষা করতে পারে।
কেনারব

ওহ, আমি বুঝতে পারি না যে সেখানে একটি শুকনো রান বিকল্প রয়েছে। ভাল সংযোজন। ক্ষমা চাওয়ার দরকার নেই। এটি দুর্দান্ত।
নীল জল

3

আমার বন্ধু "ডটগ্লোব" এর সাথে আপনাকে পরিচয় করিয়ে দিন। "*" লুকানো ফাইল অন্তর্ভুক্ত কিনা তা এটি চালু এবং বন্ধ করে দেয়।

$ mkdir test
$ cd test
$ touch a b c .hidden .hi .den
$ ls -a
. ..  .den  .hi .hidden a b c

$ shopt -u dotglob
$ ls *
a b c
$ for i in * ; do echo I found: $i ; done
I found: a
I found: b
I found: c

$ shopt -s dotglob
$ ls *
.den  .hi .hidden a b c
$ for i in * ; do echo I found: $i ; done
I found: .den
I found: .hi
I found: .hidden
I found: a
I found: b
I found: c

এটি "অফ" এ ডিফল্ট হয়।

$ shopt dotglob
dotglob         off

আপনার কাজ শেষ হয়ে গেলে এটিকে চালু করা ভাল। অন্যথায় আপনি এমন জিনিসগুলিকে বিভ্রান্ত করবেন যা ধরে নিবে যে এটি বন্ধ হয়ে যাবে।


3

findকমান্ডের সাথে একযোগে কমান্ডটি ব্যবহার করে mvআপনি mvকমান্ডকে ডিরেক্টরি (যেমন ..এবং .) এবং উপ- ডিরেক্টরিগুলি সরানোর চেষ্টা করতে বাধা দিতে পারেন । এখানে একটি বিকল্প রয়েছে:

find /path/subfolder -maxdepth 1 -type f -name '*' -exec mv -n {} /path \;

প্রদত্ত অন্যান্য উত্তরগুলির সাথে কিছু সমস্যা রয়েছে। উদাহরণস্বরূপ, নিম্নলিখিত প্রতিটি উত্স পথ থেকে উপ-ডিরেক্টরিগুলি সরানোর চেষ্টা করবে:

1) mv /path/subfolder/* /path/ ; mv /path/subfolder/.* /path/
2) mv /path/subfolder/{.,}* /path/ 
3) mv /source/path/{.[!.],}* /destination/path

এছাড়াও, 2) এর অন্তর্ভুক্ত রয়েছে। এবং .. ফাইল এবং 3) ..ফুবার, ... বারফু ইত্যাদির মতো ফাইলগুলি মিস করে

আপনি ব্যবহার করতে পারেন, mv /source/path/{.[!.],..?,}* /destination/pathযার মধ্যে 3 টি মিস করা ফাইলগুলি অন্তর্ভুক্ত থাকবে) তবে এটি এখনও সাব-ডিরেক্টরিকে সরানোর চেষ্টা করবে। findকমান্ডটি দিয়ে mvউপরে বর্ণিত কমান্ডটি ব্যবহার করা এই সমস্ত সমস্যা দূর করে।


2

এই সমস্যার সমাধান করার জন্য যখন আমার অনুমতিগুলি বজায় রাখার জন্য একটি লক্ষ্য ডিরেক্টরিতে সমস্ত ফাইল ( .ফাইল সহ ) অনুলিপি করতে হয় তখন: (ইতিমধ্যে উপস্থিত থাকলে ওভাররাইট)

yes | cp -rvp /source/directory /destination/directory/

yesগন্তব্য ফাইলগুলিকে স্বয়ংক্রিয়ভাবে ওভাররাইটিংয়ের জন্য, rপুনরাবৃত্ত, vভার্বোস, pঅনুমতি বজায় রাখা।

লক্ষ্য করুন যে উত্স পাথটি একটি দিয়ে শেষ হচ্ছে না/ (সুতরাং সমস্ত ফাইল / ডিরেক্টরি এবং। ফাইলগুলি অনুলিপি করা হয়েছে)

গন্তব্য ডিরেক্টরিটি শেষ হওয়ার সাথে/ সাথে আমরা সামগ্রিকভাবে উত্স ফোল্ডারের সামগ্রীগুলি গন্তব্যে রাখছি।


যদিও yesআপনি গন্তব্য ফাইল ওভাররাইড করতে চান ব্যবহার করার জন্য একটি ভয়ঙ্কর কমান্ড, সবসময় আকাঙ্ক্ষিত নয়। আপনি যদি এটি করতে চান নিশ্চিত হন তবেই এটি ব্যবহার করুন। এছাড়াও, yes | cp ...এবং এর মধ্যে কোনও পার্থক্য আছে cp -f ...?
mazunki
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.