आप एक डायरेक्टरी को सुरक्षित रूप से कैसे बढ़ाते हैं?


10

मैं उन निर्देशिकाओं की फ़ाइलों को कैसे स्थानांतरित कर सकता हूँ जहाँ निर्देशिका में सैकड़ों या हज़ारों फाइलें हो सकती हैं, और आप इस बारे में निश्चित नहीं हो सकते हैं कि क्या वहाँ किसी न किसी प्रकार की फ़ाइलें हैं ..। आप किस विधि का उपयोग करेंगे?

डुप्लिकेट को कैसे संभालना है, यह अलग-अलग होगा, कभी-कभी हम ओवरराइट कर देंगे, कभी-कभी हमें सुरक्षित होने की आवश्यकता होती है। IO महत्वपूर्ण हो सकता है क्योंकि ये उत्पादन सर्वर हैं। लेकिन गैर डुप्लिकेट फ़ाइलों के लिए एक संकेत दिया मात्रा एक विकल्प नहीं है। अनुमतियाँ, और टाइमस्टैम्प, आदि का संरक्षण महत्वपूर्ण है। हम आमतौर पर यह नहीं जान पाएंगे कि डेटा क्या है।

ओह, और इसका उपयोग करने mvकी आवश्यकता नहीं है rsync, cpसमाधानों का स्वागत है।

ध्यान दें: हम CentOS 5.5 चला रहे हैं, इसलिए मुझे बताएं कि अगर यह अधिक हाल ही में ... फीचर होने के कारण वहां काम नहीं करेगा


क्या आप के बारे में करना चाहते हैं?

@ स्थिति पर निर्भर करता है? मैं एक वेबहोस्ट पर काम करता हूं ... यह वास्तव में इस पर निर्भर करता है mvकि क्या हम इस मामले में संरक्षण की परवाह करते हैं ... और क्या हमने पहले ही बैकअप बना लिया है। यह प्रश्न काफी खुला है। मैं सिर्फ अच्छे विकल्पों की तलाश कर रहा हूं, और शायद इस बारे में एक टिप्पणी कि क्या यह आपको और कैसे काट सकता है।
xenoterracide

मुझे लगता है कि शेल को संभालने के लिए बहुत सारी फाइलें हैं mv * ../या mv -i * ../?
माइकल Mrozek

@ मिचेल मुझे यकीन है कि यह भिन्न होता है ... कुछ मामलों में शायद नहीं। कुछ मामलों में शायद। मैं अपने काम के लिए जितने संभव हो उतने विकल्प पकड़ने की कोशिश कर रहा हूं।
xenoterracide

जवाबों:


6

मैं माता-पिता से rsync का उपयोग करने की सलाह दूंगा:

rsync -avPr -b --suffix='-original' child/* .

जो माता-पिता की सभी मौजूदा डुप्लिकेट फ़ाइलों को -original फाइल करने के लिए बैकअप देगा ।


मुझे लगता -aहै कि इसका मतलब है-r
xenoterracide

@xenoterracide - Right you 'r'
Tok

@ क्या हार्ड कॉपी को कॉपी करना संभव है? ताकि IO बर्बाद न हो। (जैसे -lके लिए cp)
xenoterracide

@xenoterracide - हार्ड लिंक को संरक्षित करने के लिए आप rsync के लिए -Hया --hard-linksझंडे का उपयोग कर सकते हैं ।
टोक

1
@xenoterracide - आप --link-dest=DIRइस व्यवहार को प्राप्त करने के लिए ध्वज का उपयोग कर सकते हैं : rsync -avP --link-dest=/path/to/src /path/to/src/* /path/to/dest/जो sst और src के बीच किसी भी अपरिवर्तित फ़ाइलों में कड़ी कड़ी होगी, इस मामले में सभी फाइलें। आमतौर पर आप इस ध्वज का उपयोग तब करते हैं जब आप बैकअप फ़ाइलों को उनके डेटा की प्रतिलिपि बनाए बिना लिंक करना चाहते हैं जैसे कि --link-dest=/most/recent/backup
टोक

4
cp -bal . ..

यह वर्तमान निर्देशिका में इसके ऊपर की निर्देशिका में सब कुछ कॉपी करेगा, सभी अनुमतियों को बनाए रखेगा, यदि संभव हो तो IO को कम करने के लिए हार्डलिंक का उपयोग करके, और डुप्लिकेट पर यह फ़ाइल नाम बनाता है ~

उसके बाद

rm -rf . ; cd .. ; rmdir <originaldir>;

शायद बड़ी संख्या में फ़ाइल समस्या में चलता है ... लेकिन rsync के रूप में IO गहन नहीं है।
xenoterracide

2

इस उदाहरण में '/ पैरेंट / ओल्ड-डीर' से '/ पैरेंट' तक फाइल जाएगी:

cd /parent

rsync -av --progress old-dir/ .

rm -rf old-dir

Rsync नियमों के अनुसार, यह नई फ़ाइलों के साथ डिप्स को बदल देगा old-dir


1

तुम कोशिश कर सकते हो

find . -maxdepth 1 -print0 | xargs -I '{}' -r0 mv '{}' ..

जो में डुबकी फ़ाइलों को अधिलेखित कर देगा ..

आप ओवरवेट न करने के लिए mv -u '{}' का उपयोग कर सकते हैं यदि डूप इन .. एक ही है या नया है


पाइप xargs को क्यों खोजते हैं? का उपयोग क्यों नहीं +
xenoterracide

1
@xenoterracide - आदत और पोर्टेबिलिटी (यह एक GNU एक्सटेंशन है)। उसके शीर्ष पर मैंने अभी-अभी कोशिश की है और यह पता नहीं लगा सकता कि दूसरे पैरामीटर ..को mv '{}' +कमांड में कैसे पारित किया जाए क्योंकि + बस अंत में जोड़ता है।

@ मैं + POSIX में है, मुझे वास्तव में बताया गया था कि पहले GNU ढूंढने में देर हो गई थी।
xenoterracide

आप रहे हों तो सही लेकिन मैं अभी भी .. उपयोग करने के लिए एक तरह से समझ नहीं सकता

2
@xenoterracide: GNU कोरुटिल्स के साथ -exec mv -t .. -- {} +:। Portably: -exec sh -c 'mv -- "$@"' _ {} +
गिल्स एसओ- बुराई को रोकना '

1

mv -i यदि गंतव्य मौजूद है तो केवल संकेत देता है।

yes n | mv -i …गंतव्य निर्देशिका में मौजूद सभी फ़ाइलों को स्थानांतरित नहीं करता है। FreeBSD और OSX पर, आप इसे छोटा कर सकते हैं mv -n …

ध्यान दें कि इनमें से कोई भी गंतव्य निर्देशिका में समान नाम के मौजूदा निर्देशिका के साथ एक निर्देशिका तर्क को मर्ज नहीं करेगा।


एक अलग मुद्दा यह है कि वर्तमान निर्देशिका में सभी फाइलों पर कैसे कार्य किया जाए। दो समस्याएं हैं: सभी फाइलों *को हथियाना ( डॉट फाइलें छोड़ना) और कमांड लाइन में नहीं चलना। लिनक्स पर (या आमतौर पर GNU ढूँढें और GNU कोरुटिल्स के साथ):

find . -mindepth 1 -maxdepth 1 -exec mv -i -t .. -- {} +

GNU के साथ, लेकिन GNU कोरुटिल्स (या पुराने GNU कोरुटिल्स) नहीं:

find . -mindepth 1 -maxdepth 1 -exec sh -c 'mv -i -- "$@" "$0"' .. {} +

portably:

find . -name . -o -exec sh -c 'mv -i -- "$@" "$0"' .. {} -type d -prune

हमेशा की तरह zsh चीजों को आसान बनाता है। यह आंतरिक रूप से कमांड लाइन की लंबाई सीमा नहीं है, इसलिए यदि आप इसके mvबिलिन का उपयोग करते हैं तो आपको इसके बारे में चिंता करने की आवश्यकता नहीं है। और आप इसे बता सकते हैं कि Dग्लोब क्वालीफायर के साथ डॉट फाइलों को नजरअंदाज न करें । सीमा: यह फाइलसिस्टम भर में काम नहीं करता है (जैसे कि zsh 4.3.10)।

zmodload zsh/files
mv -i -- *(D) ..

कई तर्कों के लिए?
xenoterracide

0

मैंने कहा हमारे एमएल पर

mv * ..

जाहिर है यह बहुत सुरक्षित नहीं है ... यह चीजों को अधिलेखित कर देगा। इसकी सीमाएँ हो सकती हैं जिन्हें मैंने कभी नहीं चलाया।


2
यदि आपके पास बड़ी संख्या में फाइलें हैं, तो आपको 'तर्क सूची बहुत लंबी त्रुटि' मिलेगी।

2
यदि आपके पास कोई फ़ाइल नाम है, तो यह खराब हो सकता है -। यह उन फ़ाइलों को नहीं पकड़ेगा जिनके नाम के साथ शुरू होता है .
गिल्स एसओ- बुराई को रोकें '17

0

निम्नलिखित एक अजगर टेम्पलेट है जिसे मैंने अतीत में अच्छे प्रभाव के लिए इस्तेमाल किया है।

#!/usr/bin/env python
#
# Bart Kastermans, www.bartk.nl
#
# rename of collection of files in a directory
import os
import shutil

# only work on files whose name starts with a D
files = [filename for filename in os.listdir ("/Users/kasterma/Music/Audio Hijack/") if filename[0] =="D"]

for filename in files:
    shutil.move (filename, filename [:23] + ".mp3")
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.