एक स्थान से दूसरे स्थान पर फ़ोल्डर संरचना (फ़ाइलों के बिना) की प्रतिलिपि बनाएँ


94

मैं हमारे बहु-टेराबाइट फ़ाइल सर्वर की संरचना का एक क्लोन बनाना चाहता हूं। मुझे पता है कि cp -parents एक फ़ाइल को स्थानांतरित कर सकता है और यह मूल संरचना है, लेकिन क्या निर्देशिका संरचना को कॉपी करने का कोई तरीका है?

मैं एक Linux सिस्टम में कॉपी करना चाहता हूं और हमारा फाइल सर्वर CIFS है।



उपरोक्त टिप्पणी पोस्ट से rsync समाधान शून्य दिखता है।
YE

जवाबों:


158

आप कुछ ऐसा कर सकते हैं:

find . -type d > dirs.txt

निर्देशिका की सूची बनाने के लिए, फिर

xargs mkdir -p < dirs.txt

गंतव्य पर निर्देशिका बनाने के लिए।


8
यदि आपके निर्देशिका नामों में स्थान हैं तो यह समाधान काम नहीं करेगा।
जीली

29
@Jealie कमांड को बदलें find . -type d -print0 >dirs.txtऔर xargs -0 mkdir -p <dirs.txt। यह दोनों आदेशों को व्हाट्सएप के बजाय विभाजक के रूप में नल का उपयोग करने का कारण होगा।
user1207177

3
xargsजब आप सैकड़ों या हजारों के आदेश के साथ काम करना शुरू करते हैं, तो सिस्टम की अधिकतम कमांड लंबाई को पार कर सकते हैं, इसलिए सावधानी के साथ इसका उपयोग करें। (के साथ कमांड की लंबाई सीमा का पता लगाएं getconf ARG_MAX।) बहुत सारी निर्देशिकाओं के साथ, आपको आउटपुट के बजाय लूप में स्क्रिप्ट लिखनी पड़ सकती है।
पाल्सीम

1
और क्या अनुमतियों और विशेषताओं के बारे में इसे बरकरार रखा जाएगा ??
आशीष करपे

3
@TrevorBoydSmith: आपकी टिप्पणी के लिए धन्यवाद। मूल प्रश्न में अनुमतियों, स्वामित्व या विशेषताओं को संरक्षित करने की आवश्यकता के बारे में कुछ भी उल्लेख नहीं किया गया था। ऐसा करने के लिए आपको एक अलग समाधान की आवश्यकता होगी, जैसा कि आप उल्लेख करते हैं, लेकिन उपरोक्त प्रश्न के जवाब देने के लिए पर्याप्त है।
ग्रेग हेविल

79
cd /path/to/directories &&
find . -type d -exec mkdir -p -- /path/to/backup/{} \;

3
मुझे खोजने के साथ सबसे अच्छा जवाब। और आप इस एसओ सवालrsync में चेन लेवी जवाब से समाधान की कोशिश कर सकते हैं
Mat M

3
क्या है - mkdir का विकल्प?
Bruce_Warrior

9
--एक मानक GNU उपयोगिता विकल्प टर्मिनेटर है। इसका अर्थ है "हे मक्किर, इसके बाद कोई भी तर्क, यह एक ध्वज नहीं है, इसलिए इसे एक फ़ाइल तर्क के रूप में मानें, भले ही यह '-' वर्ण से शुरू हो।"
एम्फ़ैटेमाचिन

4
यह उत्तर भी निर्देशिका अनुमतियों और विशेषताओं को बरकरार नहीं रखता हैअनुमतियों और विशेषताओं को संरक्षित करने के लिए rynsc का प्रयोग करें
ट्रेवर बॉयड स्मिथ

35

यहाँ rsync का उपयोग करके एक सरल समाधान दिया गया है:

rsync -av -f"+ */" -f"- *" "$source" "$target"
  • एक पंक्ति
  • रिक्त स्थान के साथ कोई समस्या नहीं है
  • अनुमतियाँ संरक्षित करें

मुझे यह समाधान वहां मिला


10
वही लेकिन अधिक पठनीयrsync -a --include '*/' --exclude '*' "$source" "$target"
सिल्वेन

1
इस समाधान के साथ समस्या यह है: मेरे फ़ोल्डरों में हजारों फाइलें हैं और rsync को एक दर्जन फ़ोल्डरों को सिंक करने के लिए उम्र लगती है।
क्रिस्टोफर के।

6

यदि आप लिनक्स पर एक समाधान की तलाश कर रहे हैं तो मुझे पता नहीं है। यदि हां, तो आप यह कोशिश कर सकते हैं:

$ mkdir destdir
$ cd sourcedir
$ find . -type d | cpio -pdvm destdir

cpio मेरे लिए काम नहीं करता है, कम से कम आपके द्वारा निर्दिष्ट मापदंडों के साथ।
r00fus

@ r00fus - कृपया cpio के लिए मैनुअल पढ़ें या gnu.org/software/cpio
zerodin

6

यह निर्देशिका और फ़ाइलों की विशेषताओं की प्रतिलिपि बनाता है, लेकिन फ़ाइलों के डेटा की नहीं:

cp -R --attributes-only SOURCE DEST

यदि आप उन में रुचि नहीं रखते हैं, तो आप फ़ाइलों की विशेषताओं को हटा सकते हैं:

find DEST -type f -exec rm {} \;

1
बाहर निकालना एक होगा, लेकिन आप स्वामित्व, टाइमस्टैम्प और अनुमतियों को बचाने का उल्लेख करना भूल गए। इसलिए इसने Win7 / cygwin - NULL_SID उपयोगकर्ता, गलत अनुमतियों के क्रम में गड़बड़ी पैदा की, अनुमतियों को संपादित नहीं किया जा सकता है, आदि और उत्पादित फिलास्ट्रक्चर का उपयोग नहीं कर सकते।
वेबकॉमर

1
मुझे यह सोचना चाहिए कि जो कोई भी वास्तविक काम के लिए विंडोज का उपयोग करने की कोशिश करता है, उस पर दोष कितना झूठ है।
ट्रिपल

सीपी आर --attributes-केवल --preserve = सभी --parents -v स्रोत DEST
Gábor

2

निम्नलिखित समाधान ने विभिन्न वातावरणों में मेरे लिए अच्छा काम किया:

sourceDir="some/directory"
targetDir="any/other/directory"

find "$sourceDir" -type d | sed -e "s?$sourceDir?$targetDir?" | xargs mkdir -p

2

यह काम:

find ./<SOURCE_DIR>/ -type d | sed 's/\.\/<SOURCE_DIR>//g' | xargs -I {} mkdir -p <DEST_DIR>"/{}"

बस SOURCE_DIR और DEST_DIR को प्रतिस्थापित करें।


2

यह व्हॉट्सएप के साथ भी समस्या हल करता है:

मूल / स्रोत dir में:

find . -type d -exec echo "'{}'" \; > dirs2.txt

फिर इसे नए बनाए गए डायर में फिर से बनाएं:

mkdir -p <../<SOURCEDIR>/dirs2.txt

1

स्थानापन्न target_dirऔर source_dirउचित मूल्यों के साथ:

cd target_dir && (cd source_dir; find . -type d ! -name .) | xargs -i mkdir -p "{}"

OSX + Ubuntu पर परीक्षण किया गया।


0

Sergiy Kolodyazhnyy की एक पाइथन स्क्रिप्ट कॉपी पर केवल फोल्डर में है फाइल नहीं? :

#!/usr/bin/env python
import os,sys
dirs=[ r for r,s,f in os.walk(".") if r != "."]
for i in dirs:
    os.makedirs(os.path.join(sys.argv[1],i)) 

या शेल से:

python -c 'import os,sys;dirs=[ r for r,s,f in os.walk(".") if r != "."];[os.makedirs(os.path.join(sys.argv[1],i)) for i in dirs]' ~/new_destination

जानकारी के लिए:


0

एक अन्य दृष्टिकोण का उपयोग करना है treeजो अपने मजबूत विकल्पों के आधार पर बहुत आसान है और निर्देशिका पेड़ों को नेविगेट कर रहा है। केवल निर्देशिका के लिए विकल्प हैं, खाली निर्देशिकाओं को बाहर करें, पैटर्न के साथ नामों को बाहर करें, केवल पैटर्न के साथ नाम शामिल करें, आदि देखेंman tree

लाभ : आप सूची को संपादित या समीक्षा कर सकते हैं, या यदि आप बहुत सारी स्क्रिप्टिंग करते हैं और अक्सर खाली निर्देशिकाओं का एक बैच बनाते हैं

दृष्टिकोण : का उपयोग करके निर्देशिकाओं की एक सूची बनाएं tree, उस सूची का उपयोग तर्कों के इनपुट के रूप में करेंmkdir

tree -dfi --noreport > some_dir_file.txt

-dfi केवल निर्देशिकाओं को सूचीबद्ध करता है, प्रत्येक नाम के लिए पूर्ण पथ प्रिंट करता है, पेड़ को इंडेंटेशन लाइनों को प्रिंट नहीं करता है,

--noreport ट्री लिस्टिंग के अंत में फ़ाइल और डायरेक्टरी रिपोर्ट के ओमिट्स प्रिंट करना, बस आउटपुट फाइल बनाने के लिए कोई फ़्लफ़ नहीं होना चाहिए

फिर उस गंतव्य पर जाएं जहां आप खाली निर्देशिका चाहते हैं और निष्पादित करें

xargs mkdir < some_dir_file.txt

0
find source/ -type f  | rsync -a --exclude-from - source/ target/

संबंधित अनुमति और स्वामित्व के साथ ही कॉपी करें



-1

यदि आप विंडोज मशीन से पहुंच प्राप्त कर सकते हैं, तो आप बस फ़ोल्डर संरचना की नकल करने के लिए / टी और / ई के साथ xcopy का उपयोग कर सकते हैं (/ ई में खाली फ़ोल्डर शामिल हैं)

http://ss64.com/nt/xcopy.html

[संपादित करें!]

यह निर्देशिका संरचना को फिर से बनाने के लिए rsync का उपयोग करता है लेकिन फ़ाइलों के बिना। http://psung.blogspot.com/2008/05/copying-directory-trees-with-rsync.html

वास्तव में बेहतर हो सकता है :)


1
दुर्भाग्य से, हमारे CIFS सेवारत फाइलर विंडो नहीं चला रहे हैं, इसलिए कोई भी जीत कमांड पर नहीं कर सकता है।
r00fus

धन्यवाद, rsync विधि ने मेरे लिए पूरी तरह से ठीक काम किया। यह निर्देशिका नामों में रिक्त स्थान के साथ भी संगत है।
ग्लूटानाट

-1

यहाँ php में एक समाधान है कि:

  • निर्देशिकाओं की प्रतिलिपि बनाता है (पुनरावर्ती नहीं, केवल एक स्तर)
  • अनुमति सुरक्षित रखता है
  • rsync समाधान के विपरीत, हजारों फ़ाइलों वाली निर्देशिकाओं के साथ भी तेज है क्योंकि यह फ़ोल्डरों में भी नहीं जाती है
  • रिक्त स्थान के साथ कोई समस्या नहीं है
  • पढ़ने और समायोजित करने में आसान होना चाहिए

syncDirs.phpइस सामग्री के साथ एक फ़ाइल बनाएं :

<?php
foreach (new DirectoryIterator($argv[1]) as $f) {
    if($f->isDot() || !$f->isDir()) continue;
        mkdir($argv[2].'/'.$f->getFilename(), $f->getPerms());
        chown($argv[2].'/'.$f->getFilename(), $f->getOwner());
        chgrp($argv[2].'/'.$f->getFilename(), $f->getGroup());
}

इसे ऐसे उपयोगकर्ता के रूप में चलाएं जिसके पास पर्याप्त अधिकार हैं:

sudo php syncDirs.php /var/source /var/destination


आपको PHP पसंद नहीं है और आपको इसका उपयोग नहीं करना है। लेकिन ओपी ने यह निर्दिष्ट नहीं किया कि वह किसी विशिष्ट भाषा में समाधान चाहता है या नहीं, जैसे कि या नहीं, PHP बहुत सारे लिनक्स सिस्टम पर वैसे भी स्थापित है क्योंकि वेब का 80% PHP ( w3techs.com/technologies/details/pl-) का उपयोग करता है php / all / all )।
क्रिस्टोफर के।
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.