एक ही समय में एक फ़ोल्डर को कैसे स्थानांतरित करें और पुन: बनाएँ?


9

मेरे पास एक statisticsउबंटू सर्वर में एक फ़ोल्डर है जिसमें डेटा फाइलें नियमित रूप से संग्रहीत की जाती हैं। नई फ़ाइलों को संग्रहीत करने के लिए उपलब्ध फ़ोल्डर को फिर से बनाते समय मैं statisticsफ़ोल्डर का नाम कैसे बदल सकता हूं ?backup-xxstatistics

statisticsफ़ोल्डर में फ़ाइलें PHP द्वारा बनाई गई हैं file_put_contents

मैं फ़ोल्डर का नाम बदलना पसंद करता हूं, क्योंकि फ़ोल्डर में कई फाइलें हैं statistics


पहले मुझे लगा कि आप "एक ही समय में" के साथ मतलब है कि ऑपरेशन "परमाणु" (जहां तक ​​संभव हो) होना चाहिए ।
phk

@ हाँ, यह वही है जो मेरा मतलब है।
गूगलबोट

सही शब्दावली "निर्देशिका" होगी और "फ़ोल्डर" नहीं होगी।
बर्क czbalcı

जवाबों:


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मालिकाना हक और अनुमति भी चाहते हैं । Ideall आप नाम बदलने से पहले ऐसा करेंगे, इसलिए एक mkdir new ; chown ; chmod ; mv stats backup ; mv new statsप्रकार की प्रक्रिया।
स्टीफन हैरिस

@StephenHarris हाँ, उन झंडे वाले सिस्टम पर।
Kusalananda

हालांकि यह परमाणु नहीं है। यह परमाणु के करीब है, लेकिन काफी नहीं है।
सीवीएन

@ MichaelKjörling ने इसे निश्चित किया।
Kusalananda

ln -sfपरमाणु नहीं है। यह पुराने सिम्कलिन को अनलिंक करने के लिए निर्दिष्ट है, फिर एक नया बनाएं, जो जरूरी गैर-परमाणु है। इसके बजाय आपको एक अतिरिक्त अस्थायी सिमलिंक बनाना होगा और renameफ़ंक्शन ( mvकमांड के माध्यम से , उदाहरण के लिए) का उपयोग एटमेटिक रूप से पुराने को बदलने के लिए करना होगा। इसके लिए मेरा दृष्टिकोण यहाँ देखें: git.musl-libc.org/cgit/musl/tree/tools/…
R .. GitHub STOP

12

किसी निर्देशिका को किसी अन्य निर्देशिका द्वारा एटोमिकली बदलने का कोई तरीका नहीं है । आप पुरानी निर्देशिका को स्थानांतरित कर सकते हैं फिर एक नई निर्देशिका बना सकते हैं:

mv statistics backup-xx
mkdir statistics

लेकिन यह समय की एक छोटी सी खिड़की छोड़ देता है जिसके दौरान statisticsमौजूद नहीं है। यह एक समस्या है अगर कोई प्रक्रिया किसी भी समय निर्देशिका में फ़ाइलों को छोड़ सकती है।

प्रभावी ढंग से एक निर्देशिका को बदलने के लिए, आपको प्रतीकात्मक लिंक का उपयोग करने की आवश्यकता है। एक निर्देशिका बनाएँ जिसका नाम शुरू से समय अवधि शामिल है:

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

(या हालाँकि आप निर्देशिका नामकरण सम्मेलन का चयन करना चाहते हैं)। वर्तमान स्थान के लिए एक निश्चित नाम के साथ एक प्रतीकात्मक लिंक बनाएं:

ln -s  statistics

निर्देशिका को बदलने के लिए, पहले एक नई निर्देशिका और एक नया प्रतीकात्मक लिंक बनाएं, और फिर पुराने प्रतीकात्मक लिंक को अधिलेखित करने के लिए इसे स्थानांतरित करें। ध्यान दें कि न mvतो प्रतीकात्मक लिंक पर एक सादा और न ही एक सादा ln -sऐसा करेगा: वे लक्ष्य निर्देशिका के अंदर एक प्रविष्टि बनाएंगे। GNU कोरुटिल्स ln -snfया तो उपयुक्त नहीं है क्योंकि यह एक नया निर्माण करने से पहले मौजूदा सिमलिंक को हटा देता है, जो एक छोटी समय विंडो को छोड़ देता है जिसके दौरान पथ मौजूद नहीं है। आप mv -Tनए प्रतीकात्मक लिंक पर GNU कोरुटिल्स का उपयोग कर सकते हैं ।

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

busybox' ln -sfभी परमाणु नहीं है, मैं किसी भी कार्यान्वयन के बारे में नहीं जानता।
फुक

1
बगल में phk की टिप्पणी सिमिलिंक भी 100% सुरक्षित नहीं है क्योंकि एक चल रही प्रक्रिया में अभी भी एक खुली निर्देशिका फ़ाइल डिस्क्रिप्टर (सिमलिंक टारगेट) हो सकती है और यह नामांकित निर्देशिका ( 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/.
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.