একই সাথে একটি ফোল্ডার কীভাবে সরানো এবং পুনরায় তৈরি করা যায়?


9

আমার statisticsএকটি উবুন্টু সার্ভারে ডাকা একটি ফোল্ডার রয়েছে যাতে নিয়মিতভাবে ডেটা ফাইল সঞ্চয় করা হয়। নতুন ফাইলগুলি সংরক্ষণের জন্য ফোল্ডারটি পুনরায় তৈরি statisticsকরার backup-xxসময় আমি কীভাবে ফোল্ডারটির নাম পরিবর্তন করতে পারি statistics?

statisticsফোল্ডারে থাকা ফাইলগুলি পিএইচপি দ্বারা তৈরি করা হয় file_put_contents

আমি ফোল্ডারটির নামকরণ পছন্দ করি, কারণ ফোল্ডারে অনেকগুলি ফাইল রয়েছে statistics


প্রথমে আমি ভেবেছিলাম আপনি "একই সাথে " বোঝাতে চেয়েছিলেন যে অপারেশনটি "পারমাণবিক" হওয়া উচিত (যতদূর সম্ভব)।
phk

@ পিএফকে হ্যাঁ, আমি যা বলছিলাম ঠিক তাই exactly
গুগলবট

সঠিক পরিভাষাটি "ডিরেক্টরি" এবং উপায় "ফোল্ডার" নয়।
বার্ক balzbalcı

উত্তর:


7
mv statistics backup-xx && mkdir statistics

এটি বিদ্যমান statisticsডিরেক্টরিটির নতুন নামকরণ করবে backup-xxএবং এটি যদি সফল হয় তবে এটি একটি নতুন statisticsডিরেক্টরি তৈরি করতে চালিত হবে ।

আরও বেশি পারমাণবিক ক্রিয়াকলাপের জন্য, একটি ডিরেক্টরি তৈরি করা statistics-001(বা অনুরূপ, সম্ভবত 001উপযুক্ত তারিখের সাথে আজকের তারিখের পরিবর্তে ) এবং এটির একটি প্রতীকী লিঙ্ক বিবেচনা করুন statistics:

mkdir statistics-001
ln -s statistics-001 statistics

আপনি যখন এটি "আবর্তন" করতে চান যাতে নতুন ডেটা একটি পরিষ্কার ডিরেক্টরিতে যায়, প্রথমে ডিরেক্টরি তৈরি করুন, তারপরে এই statisticsলিঙ্কটি পুনরায় তৈরি করুন :

mkdir statistics-002
ln -sf statistics-002 statistics

mv statistics-001 backup-001

এই ভাবে, কোন প্রোগ্রাম লেখার statisticsডিরেক্টরি (অর্থাত এই সিম্বলিক লিঙ্ক পয়েন্ট) যে কখনও হবে 1 সেটা খুঁজে পেতে ব্যর্থ হয়।

ডিরেক্টরিতে নির্দেশিত নির্দেশিকায় যদি আপনার বিশেষ অনুমতি বা মালিকানা সেট প্রয়োজন statisticsহয়, লিঙ্কটি তৈরি করার আগে এগুলি পুনরায় সেট করুন (পুনরায়)।

1 বা বরং, এই উপায়ে, কোনও প্রোগ্রাম কোনও বৈধ টার্গেট ডিরেক্টরি ছাড়াই হবে এমন সময় স্ট্যান্ডার্ড ইউনিক্স সরঞ্জাম ব্যবহার করে যতটা সম্ভব ব্যবহারিকভাবে সম্ভব হ্রাস করা যায়।


1
আপনি chown --reference=backup-xx statistics ; chmod --reference=backup-xx statisticsমালিকানা এবং অনুমতি নির্ধারণ করতে চাইবেন । পুনরায় নামকরণের আগে আদর্শভাবে আপনি এটি করবেন, সুতরাং একটি mkdir new ; chown ; chmod ; mv stats backup ; mv new statsটাইপ প্রক্রিয়া।
স্টিফেন হ্যারিস

@ স্টেফেনহরিস হ্যাঁ, যেসব সিস্টেমে এই পতাকা রয়েছে on
কুসালানন্দ

এটি যদিও পারমাণবিক নয়। এটি পারমাণবিকের কাছাকাছি , তবে বেশ নয়।
একটি সিভিএন

@ মাইকেলKjörling এটি স্থির করে।
কুসালানন্দ

ln -sfপারমাণবিক নয়। এটি পুরানো সিমিলিংকটিকে লিঙ্কযুক্ত করে নির্দিষ্ট করে তারপর একটি নতুন তৈরি করুন, যা অ-পারমাণবিক arily পরিবর্তে আপনাকে একটি অতিরিক্ত অস্থায়ী সিমিলিংক তৈরি করতে হবে এবং পুরানোটিকে পরমাণুভাবে প্রতিস্থাপন করতে renameফাংশনটি ( mvউদাহরণ হিসাবে কমান্ডের মাধ্যমে ) ব্যবহার করতে হবে। এখানে এটি সম্পর্কে আমার দৃষ্টিভঙ্গিটি দেখুন: git.musl-libc.org/cgit/musl/tree/tools/…
আর ..

12

অন্য ডিরেক্টরি দ্বারা কোনও ডিরেক্টরিকে পরমাণুর সাথে প্রতিস্থাপন করার কোনও উপায় নেই । আপনি পুরানো ডিরেক্টরিটি সরাতে পারেন তারপরে একটি নতুন ডিরেক্টরি তৈরি করতে পারেন:

mv statistics backup-xx
mkdir statistics

তবে এটি সময়ের একটি ছোট উইন্ডো ছেড়ে statisticsদেয় যা অস্তিত্বহীন। যদি কোনও প্রক্রিয়া যে কোনও সময়ে ডিরেক্টরিতে ফাইল ফেলে দিতে পারে তবে এটি একটি সমস্যা।

কার্যকরভাবে কোনও ডিরেক্টরি পরমাণুর সাথে প্রতিস্থাপন করতে আপনাকে প্রতীকী লিঙ্কগুলি ব্যবহার করতে হবে। একটি ডিরেক্টরি তৈরি করুন যার নামের শুরু থেকে সময়কাল অন্তর্ভুক্ত:

mkdir "statistics-$(date +%Y%m%d)"

(বা তবে আপনি ডিরেক্টরি নামকরণ কনভেনশন চয়ন করতে চান)। বর্তমান অবস্থানে একটি নির্দিষ্ট নাম সহ একটি প্রতীকী লিঙ্ক তৈরি করুন:

ln -s  statistics

ডিরেক্টরিটি প্রতিস্থাপন করতে প্রথমে একটি নতুন ডিরেক্টরি এবং একটি নতুন প্রতীকী লিঙ্ক তৈরি করুন এবং তারপরে এটি পুরানো প্রতীকী লিঙ্কটি ওভাররাইট করতে সরান। লক্ষ করুন যে mvপ্রতীকী লিঙ্কের কোনও সমতল বা সমতল কোনও এটি ln -sকরবে না: তারা লক্ষ্য ডিরেক্টরিতে একটি এন্ট্রি তৈরি করবে। জিএনইউ কোর্টিলসগুলি ln -snfউপযুক্ত নয় কারণ এটি একটি নতুন তৈরির আগে বিদ্যমান সিমলিংকটিকে সরিয়ে দেয়, যা একটি ছোট সময় উইন্ডো ছেড়ে দেয় যার মধ্যে পথে অস্তিত্ব নেই। আপনি mv -Tনতুন প্রতীকী লিঙ্কে জিএনইউ কোর্টিলগুলি ব্যবহার করতে পারেন ।

new_dir="statistics-$(date +%Y%m%d)"
mkdir "$new_dir"
ln -s statistics.new
mv -Tf statistics.new statistics

busybox' ln -sfএটিও পারমাণবিক নয়, আমি এর বাস্তবায়ন সম্পর্কে জানি না।
পিএইচকে

1
পিএইচসি-র মন্তব্যের পাশাপাশি সিমলিংকগুলিও ১০০% নিরাপদ নয় কারণ একটি চলমান প্রক্রিয়াটিতে এখনও একটি ওপেন ডিরেক্টরি ফাইল বিবরণকারী (সিমলিংক লক্ষ্য) থাকতে পারে এবং এটি নাম পরিবর্তিত ডিরেক্টরিতে আরও নতুন ফাইল তৈরি করতে পারে (সম্পর্কে চিন্তা করুন openat()বা সিডাব্লুডি)। আমি কেবল ডিরেক্টরিটির বিষয়বস্তুটিকে একটি নতুন স্থানে নিয়ে যেতে চাই । এটি এখনও উন্মুক্ত ফাইলগুলি সম্পর্কে অনিরাপদ তবে এটি আরও ভাল। সন্দেহজনকভাবে ব্যবহার করুন logrotateযা এই জাতীয় সমস্যাটিকে সর্বোত্তমভাবে সম্মান করা উচিত।
rudimeier

1
@ phk symlinkসিস্টেম কলটি কোনও বিদ্যমান ফাইলকে ওভাররাইট করবে না, সুতরাং দুর্ভাগ্যক্রমে, প্রতীকী লিঙ্কটি সরাসরি অ্যাটমিকভাবে স্যুইচ করা অসম্ভব। renameসিস্টেম কল করবেন তা একটি বিদ্যমান ফাইল ওভাররাইট হবে, কিন্তু annoyingly সেখানে শেল এটা করার কোন পোর্টেবল উপায়; -Tবিকল্পটি ধন্যবাদ জিএনইউ কোর্টিলগুলি দিয়ে এটি সম্ভব ।
গিলস 'অসন্তুষ্ট হওয়া বন্ধ করুন'

3

ডিরেক্টরিটির পুনরায় নামকরণ করবেন না। আপনি বলেছিলেন যে আপনি ডিরেক্টরিটির নাম পরিবর্তন করতে পছন্দ করেন কারণ এতে প্রচুর ফাইল রয়েছে। আমি এটি ভাবতে পারার একমাত্র কারণ যে ফাইলগুলি অনুলিপি করাতে অনেক বেশি সময় লাগবে তা কারণ। যাইহোক, ফাইলগুলি সরানো (অর্থাত্ পুনরায় নামকরণ) ততক্ষণ তত্ক্ষণিক হয় যতক্ষণ না সেগুলি একই ফাইল সিস্টেমের কোনও স্থানে স্থানান্তরিত হয়। আমি ধরে নিই যে আপনি পিঁপড়াটি যা করতে হবে সেহেতু আপনি যদি ফাইল সিস্টেম পরিবর্তন করছেন, এটি ডিরেক্টরি বা এটির বিষয়বস্তুগুলি সরিয়ে নিচ্ছে কিনা তা mvযতটা সময় নেয় cpনা।

সুতরাং, কেবল করুন:

mkdir backup-xx && mv statistics/* backup-xx

আপনার যদি লুকানো ফাইলগুলিও পেতে হয় তবে আপনি এটি করতে পারেন:

mkdir backup-xx && mv statistics/* statistics/.* backup-xx

অথবা, যদি ব্যবহার করা হয় bash:

shopt -s dotglob; mkdir backup-xx && mv statistics/* statistics/.* backup-xx

এইভাবে, ডিরেক্টরি সর্বদা থাকে তবে আপনি এখনও এর সামগ্রীগুলি একটি সহজ এবং দ্রুত অপারেশনে সরিয়ে রাখেন।


1

আপনি পরিসংখ্যান ফোল্ডারের বিষয়বস্তু সরিয়ে ফোল্ডারে না গিয়ে নতুন তৈরি ডিরেক্টরিতে সরাতে পারেন। আপনি যদি পুরো ফোল্ডারটি সরান তবে আপনাকে ডিরেক্টরি অনুমতিগুলি পরিবর্তন করতে অন্য একটি কমান্ড চালাতে হবে।

mkdir -p <path>/backup-xxx
mv statistics/* <path>/backup-xxx/.
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.