এমভি দিয়ে টার্গেট ফাইলগুলি কীভাবে ওভাররাইট করা যায়?


154

আমার একটি সাব-ডিরেক্টরিতে আমি পিতামহিত ডিরেক্টরিতে যেতে চাইছি তাতে একটি টন ফাইল এবং ডায়ার রয়েছে। লক্ষ্য ডিরেক্টরিতে ইতিমধ্যে কিছু ফাইল এবং ডায়ার রয়েছে যা ওভাররাইট করা দরকার। যে লক্ষ্যগুলি কেবলমাত্র লক্ষ্যমাত্রায় উপস্থিত রয়েছে সেগুলিকে অদৃশ্য রেখে দেওয়া উচিত। আমি কি এটা করতে বাধ্য mvকরতে পারি? এটি ( mv * ..) অভিযোগ করে

mv: cannot move `xyz' to `../xyz': Directory not empty

আমি কী মিস করছি?


3
আপনি চেষ্টা করেছেন mv -f?
সাকিস্ক

আমি ভাবছি কেন mv -fসঠিক উত্তর নেই isn't
পেড্রো লোবিটো

@ পেড্রোলোবিটো: কারণ এটি কাজ করে না? -ফ কেবল ফাইলগুলিকে ওভাররাইট করে তবে আপনি গন্তব্যস্থলে বিদ্যমান সাব ডাইরেক্টরিগুলি সরিয়ে ফেলেন এবং খালি না হলে কাজ করে না।
এরিকশাফার

উত্তর:


117

কমান্ডগুলি cp -r * ..অনুসরণ করে আপনাকে গন্তব্যে অনুলিপি করতে হবে এবং তারপরে উত্সটি মুছতে হবে rm -rf *

আমি মনে করি না আপনি ডিরেক্টরিগুলি "মার্জ" করে ব্যবহার করতে পারেন mv


4
ঠিক আছে, আমি এটি করতে চাইনি কারণ এটি অনেক দিন সময় নিতে পারে ... যাইহোক ধন্যবাদ।
এরিকশাফার

12
সম্ভবত mvআপনি একই ফাইল সিস্টেমে থাকায় দ্রুত? আপনি যদি cp -lফাইলগুলি বাস্তবে সরানোর পরিবর্তে হার্ডলিঙ্কগুলি তৈরি করতে ব্যবহার করেন?
ম্যাটডেম

6
ফাইল বৈশিষ্ট্যগুলি (টাইমস্ট্যাম্প, অনুমতি ইত্যাদি) সংরক্ষণ করার cp -aপরিবর্তে আপনার ব্যবহার করা উচিত cp -r
dotancohen

2
গুগলের মাধ্যমে দেরীতে এখানে পৌঁছে দেওয়া লোকদের জন্য, @ পালসুইমের নীচের উত্তরটি ডেটাতে নতুন হার্ড লিঙ্ক তৈরি করে এবং তারপরে পুরানো লিঙ্কগুলি মুছে ফেলার মাধ্যমে এমভি এর আচরণ অনুকরণ করে। সংক্ষিপ্ত উত্তর cp -rl source destination && rm -r source
উইলিয়াম এভারেট

72

rsyncসম্ভবত এখানে একটি ভাল বিকল্প হতে পারে। এটা যেমন সহজ rsync -a subdir/ ./

আমার পরীক্ষার বৃক্ষ এতে filename: contentsফর্ম্যাট:

./file1:root
./file2:root
./dir/file3:dir
./dir/file4:dir
./subdir/dir/file3:subdir
./subdir/file1:subdir

চলমান rsync:

$ rsync -a -v subdir/ ./
sending incremental file list
./
file1
dir/
dir/file3

দেয়:

./file1:subdir
./file2:root
./dir/file3:subdir
./dir/file4:dir
./subdir/dir/file3:subdir
./subdir/file1:subdir

এবং তারপরে, অনুকরণ করতে mv, আপনি সম্ভবত উত্স ডিরেক্টরিটি মুছে ফেলতে চান:

$ rm -r subdir/

প্রদান:

./file1:subdir
./file2:parent
./dir/file3:subdir
./dir/file4:dir

যদি এটি ভুল হয়, আপনি দয়া করে পছন্দসই ফলাফলের সাথে একটি অনুরূপ উদাহরণ সরবরাহ করতে পারেন (উদাহরণস্বরূপ এই উত্তরের শীর্ষের কাছ থেকে আমার পরীক্ষার গাছটি ব্যবহার করে)?


1
rsync কপি। এই প্রশ্নটি চলন্ত সম্পর্কে।
গিলস

1
@ গিলস: ধন্যবাদ আমি rm -rএটিকে মূলত একইরূপে তৈরি করতে শেষে যুক্ত করেছি mv
মিকেল

3
উত্স এবং গন্তব্য একই ফাইল সিস্টেমে থাকে তখন অনুলিপি-মুছে ফেলা এমভি এর সমতুল্য নয়। mvপারমাণবিক, ইনোড নম্বর সংরক্ষণ করে (যাতে ফাইলটি উন্মুক্ত থাকতে পারে), এবং অনুলিপি তৈরি করতে সময় এবং স্থান নেয় না।
গিলস

5
@ গিলস: আমি বুঝতে পেরেছি, তবে বর্তমানে সর্বাধিক উত্তর রয়েছে cp -r; rm -r। আমি সেই অর্থে মনে করি, rsyncএটিও উল্লেখ করার মতো।
মিকেল

আমি ইতিমধ্যে এটি সিপি / আরএম দিয়ে করেছি (এটি জরুরি ছিল)। এটি সত্যই দীর্ঘ সময় নিয়েছে। গিলিস স্ক্রিপ্টটি সম্ভবত অনেক তাড়াতাড়ি হত, তবে তিনি খুব দেরী করেছিলেন।
এরিকশাফার

47

rsync--remove-source-filesপ্যারামিটারের সাথে অনুলিপি করার পরে উত্স মুছতে পারে । আপনি যা চান তা করার এটি একটি সুবিধাজনক উপায় হওয়া উচিত।

থেকে rsync man page:

        --remove-source-files   sender removes synchronized files (non-dir)

এটি সত্যই সেরা উত্তর। cp -r; rmফাঁকা জায়গার অভাবে আমি ব্যবহার করতে পারিনি । পরিবর্তে rsync --remove-source-filesউভয়ই হ্রাস করা ব্যবহৃত ডিস্কের স্থান সঠিক একই ফাইলগুলিতে অনুলিপি করা এড়ানো।
গুয়াকা

20

আপনি এটি দিয়ে cpএবং করতে পারেন rm, তবে আপনি স্থানান্তর এড়ানোর চেষ্টা করছেন এমন প্রচুর পরিমাণে ডেটা (সম্ভবত) অনুলিপি না করেই। @ মেট্টেম তার মন্তব্যে এটির ইঙ্গিত দিয়েছে এবং অন্য প্রশ্নের উত্তর একটি উত্তর বিভিন্ন বিকল্প সম্পর্কে আরও সম্পূর্ণ আলোচনা করেছে has

cp -rlf source destination
rm -r source

মূলত, কমান্ডের -lবিকল্পটি cpনতুন ফাইলগুলিতে তাদের ডেটা অনুলিপি করার চেয়ে ফাইলগুলিতে হার্ড লিঙ্ক তৈরি করে।


1
আমি জানি ওপি ইতিমধ্যে তার কাজটি সম্পন্ন করেছে যা প্রশ্নটি উত্সাহিত করেছিল, তবে আশা করি এই উত্তর ভবিষ্যতে এই সমস্যাটি যে কাউকে সহায়তা করতে পারে।
পালসুইম

এটি সত্যই তাদের উত্তর প্রয়োজন। আমি মাত্র হাজার হাজার ছোট সাইরাস ইমেল ফাইল এটি 60 গিগাবাইটের সাহায্যে করেছি এবং এটি মাত্র 21 সেকেন্ড সময় নিয়েছিল।
ল্যাব্রাডোর্ট

এটিও আমি যে রুটে নিয়েছি - এটি আমি cp -al source destinationমালিকের তথ্য এবং অনুমতি সংরক্ষণের জন্য এটিকে পরিবর্তন করেছি ।
piit79

আমি ভাবি যে ওপি আপনাকে আসলে -f বিকল্পটি যোগ করতে বলেছে তা করতে চাইলে অন্যথায় ফাইলটি উপস্থিত থাকলে এটি ওভাররাইট হবে না। আপনি কি তা নিশ্চিত করতে পারেন বা আমি কিছু ভুল করছি?
ডাস কেকস

@ ডাসকিক্স: আসলে, cpডিফল্টরূপে ওভাররাইট। -fবিকল্প ফাইলটি সরাতে (হিসাবে প্রচেষ্টা rmনতুনভাবে কপি করতে, যা যদি প্রক্রিয়া লেখার জন্য ফাইল খুলতে পারবে না যদিও কিছু লোক দেখতে একটি ত্রুটি পরিবর্তে ছিল পছন্দ করেন সাহায্য করতে পারেন, চেষ্টা করার আগে)। আমি জানি না এটি ওপিতে কী পরিমাণ গুরুত্ব পেয়েছে, তবে আমি -fযাইহোক আমার উত্তরটিতে পতাকাটি যুক্ত করেছি।
পালসুইম

8

এখানে এমন স্ক্রিপ্ট রয়েছে যা ফাইলগুলি নীচে থেকে নীচে /path/to/source/rootসম্পর্কিত পথে চলে যায় /path/to/destination/root

  • যদি কোনও ডিরেক্টরি উত্স এবং গন্তব্য উভয় ক্ষেত্রেই বিদ্যমান থাকে তবে বিষয়বস্তু সরানো এবং পুনরাবৃত্তভাবে মার্জ করা হয়।
  • উত্সটিতে কোনও ফাইল বা ডিরেক্টরি উপস্থিত থাকলেও গন্তব্যে নেই, এটি সরানো হবে।
  • গন্তব্যটিতে ইতিমধ্যে বিদ্যমান যে কোনও ফাইল বা ডিরেক্টরি পিছনে রয়েছে। (বিশেষত মার্জ করা ডিরেক্টরিগুলি উত্সটিতে পিছনে রয়েছে This এটি ঠিক করা সহজ নয়))

সাবধান, অরক্ষিত কোড tes

export dest='/path/to/destination/root'
cd /path/to/source/root
find . -type d \( -exec sh -c '[ -d "$dest/$0" ]' \; -o \
                  -exec sh -c 'mv "$0" "$dest/$0"' {} \; -prune \) \
    -o -exec sh -c '
        if ! [ -e "$dest/$0" ]; then
          mv -f "$0" "$dest/$0"
        fi
' {} \;

দুই সংশোধন: যদি আপনি প্রয়োজন \;আগে -oপ্রথম লাইনে findকমান্ড, এবং আপনি অব্যাহতি করা উচিত নয় !মধ্যে if- এটা শুধু !না\!
llhuii

2

এই থ্রেডটি বছরের পর বছর ধরে বাইরে রয়েছে এবং এখনও গুগলে # 1 র স্থানে রয়েছে তাই আমি অন্য একটি পদ্ধতি যুক্ত করতে চাই। আমি কীভাবে এটি করি: সাবডির কনটেন্টটি একটি টারবলে প্যাক করা, তারবালকে প্যারেন্ট ডিরেক্টরিতে নিয়ে যাওয়া এবং তারপরে এটি ডিফল্ট - ওভাররাইট আচরণের মাধ্যমে বের করা। এটি ঠিক আপনি যা খুঁজছেন তা করে। এরপরে আপনি আপনার সাবডিরটি সরাতে পারেন।

cd xyz
tar -cvzpf tmp.tar.gz *
mv tmp.tar.gz ../tmp.tar.gz
cd ..
tar -xvzpf tmp.tar.gz
rm -rf xyz
rm -f tmp.tar.gz

এটি কেবল তখনই কাজ করে যদি আপনার সংকুচিত টার ফাইলের জন্য অতিরিক্ত জায়গা থাকে। এবং আপনি কি নিষেধাজ্ঞার পরে অস্থায়ী টার ফাইলটি প্রায় রাখতে চান?
অ্যান্থন

টিএমপি ফাইল সরানোর জন্য সম্পাদিত কোড। আজকাল স্থান বেশিরভাগ ক্ষেত্রেই সমস্যা নয়। #terabyteages
সাইমন

0

আপনার যদি পর্যাপ্ত সঞ্চয়স্থান থাকে তবে আপনি এটি নিম্নলিখিত উপায়ে করতে পারেন:

mv -bfv directory_1/* directory_2/ # all duplicate source files/directories 
                                   # will have ~ appended to them
find -name "*~" -delete            # will recursively find and delete all files 
                                   # with ~ on the end

এগুলির শেষে একটি with সহ কোনও গুরুত্বপূর্ণ ফাইল নেই তা নিশ্চিত করুন, তবে সেখানে --suffix=whateveryouwantডিফল্ট পরিবর্তে আপনি যুক্ত করতে পারেন ।

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