2011-03-11 16 views
31

मेरे पास एक निर्देशिका है ~/plugins/ और अंदर कई उप-निर्देशिकाएं हैं। अगर मैं abc से शुरू होने वाली उप-निर्देशिकाओं के कहीं और बैकअप बनाना चाहता था, तो क्या मैं इसे एक लाइन कॉपी कमांड के साथ कर सकता हूं? मैं कुछ ग्रहण करेंगे की तरह इस काम करेगा (लेकिन यह नहीं है):लिनक्स/यूनिक्स पर "एबीसी" से शुरू होने वाली निर्देशिकाओं को दोबारा कैसे कॉपी करें?

 
cp -R ~/plugins/abc* ~/destination/ 

मैं नहीं बल्कि एक पंक्ति आदेश, यदि संभव हो, क्योंकि मैं भी rsync के लिए एक ही वाक्य विन्यास का उपयोग करना चाहते हैं, का प्रयोग करेंगे और इसका मतलब होगा कि अगर मैं

 
find ~/plugins/ -type d -name "abc*" -exec cp -R {} ~/destination; 
तो

कि cp आदेश के लिए ठीक काम करता है, लेकिन जैसे कुछ करने के लिए मैं rsync एक बार प्रत्येक निर्देशिका के लिए चलाना होगा कि और कहा कि बस नहीं लगता कुशल :(

+0

क्यों क्या यह आपके लिए काम नहीं करता है? मैंने इसका परीक्षण किया और यह ठीक काम किया। क्या आपको उपनिर्देशिकाओं के माध्यम से रिकर्सिव ट्रैवर्सल की आवश्यकता है? पुराने स्कूल यूनिक्स के लिए –

उत्तर

51

सुनिश्चित नहीं हैं कि क्यों क्या आप काम नहीं किया कोशिश कर रहे हैं (लेकिन क्या "कॉपी" कमांड है?), लेकिन यह कम से कम लिनक्स पर काम करता है:

cp -r ~/plugins/abc* ~/destination 
+1

मैंने स्विच करने से पहले कई वर्षों तक डॉस का उपयोग किया। कॉपी कॉपी कमांड यही है। मैं इसे फिर से कोशिश करूंगा और देख सकता हूं कि यह काम करता है :) – cwd

4

यहां एक पुरानी चाल है जिसे मैं अभी भी अक्सर उपयोग करता हूं:

(cd ~/plugins/ && tar cfp - abc/) | (cd ~/destination && tar xfpv -) 

जहां p को बरकरार रखता है गुण, और ~/destination कहीं भी हो सकता है।

+0

+1 :) – MLH

1

यह उत्पादन उपयोग करना संभव है findrsync साथ की:

# warning: untested 
find ~/plugins/ -type d -name "abc*" -print0 | rsync -av --files-from=- --from0 ~/plugins/ ~/destination 
  • find में -print0, और rsync में --from0 सुनिश्चित करें कि हम फ़ाइलों बुद्धि संभाल बनाता है ज रिक्त स्थान को सही ढंग से
  • --files-from=- कहती है कि हम stdin
+0

यह एक बहुत अच्छी चाल है! – cwd

0
#!/usr/bin/env perl 
# copie un fichier avec l'arbo 
# 
# 
use File::Basename; 
use File::Copy; 
my $source = shift; 
my $dest = shift; 
if(!defined $source){ print "Manque fichier source"; exit(0); } 
if(!defined $dest){ print "Manque repertoire dest"; exit(0); } 

my $dir = dirname($source); 
my $file = basename($source); 

my @arbo = split(/\//, $dir); 
my $direct = $dest; 
if(!-d $direct) { mkdir $direct; } 
foreach my $d(@arbo) { 
     $direct.="/".$d; 
     if(!-d $direct) { mkdir $direct; } 
} 
copy($source,$direct); 

नाम

CopyFile उदाहरण के लिए इस कोड स्निपेट परीक्षण से फ़ाइलों की एक सूची पढ़ रहे हैं: उपयोग: ./copyfile

+0

अंग्रेजी बोलने वालों के लिए नोट: "arbo" स्पष्ट रूप से "arborescence" (उर्फ "पेड़ संरचना") के लिए छोटा है –

संबंधित मुद्दे

 संबंधित मुद्दे