मैं एक विशिष्ट उप-निर्देशिका में कुछ फ़ाइलों को छोड़कर एक निर्देशिका में सभी फ़ाइलों को कॉपी करना चाहता हूं। मैंने देखा है कि 'cp' कमांड में एक --exclude विकल्प नहीं था। तो, मैं इसे कैसे प्राप्त कर सकता हूं?
tar -c | tar -x
?
मैं एक विशिष्ट उप-निर्देशिका में कुछ फ़ाइलों को छोड़कर एक निर्देशिका में सभी फ़ाइलों को कॉपी करना चाहता हूं। मैंने देखा है कि 'cp' कमांड में एक --exclude विकल्प नहीं था। तो, मैं इसे कैसे प्राप्त कर सकता हूं?
tar -c | tar -x
?
जवाबों:
rsync तेज और आसान है:
rsync -av --progress sourcefolder /destinationfolder --exclude thefoldertoexclude
आप --exclude
कई बार उपयोग कर सकते हैं ।
rsync -av --progress sourcefolder /destinationfolder --exclude thefoldertoexclude --exclude anotherfoldertoexclude
ध्यान दें कि विकल्प के thefoldertoexclude
बाद dir , यानी, के --exclude
सापेक्ष है ।sourcefolder
sourcefolder/thefoldertoexclude
इसके अलावा आप -n
ड्राई रन के लिए जोड़ सकते हैं यह देखने के लिए कि असली ऑपरेशन करने से पहले क्या कॉपी किया जाएगा, और अगर सब कुछ ठीक है, तो -n
कमांड लाइन से हटा दें ।
--exclude
thefoldertoexclude
सापेक्ष है sourcefolder
? धन्यवाद
rsync -av --progress --exclude="thefoldertoexclude" sourcefolder /destinationfolder
- वैसे भी rsync के लिए खोज के बजाय upvote, क्योंकि आप आसानी से स्रोत के लिए निरपेक्ष पथ का उपयोग कर सकते हैं, जबकि खोजने में यह पेचीदा है क्योंकि यह {}
dst में उपयोग करता है ।
$ rsync user@example.com:/var/www/mypage /var/www/mylocalpage/
या लोकल से रिमोट के लिए$ rsync /var/www/mylocalpage/ user@example.com:/var/www/mypage
ठीक है, अगर कुछ फ़ाइल नाम पैटर्न का बहिष्करण हर यूनिक्स-ईश फ़ाइल उपयोगिता (जैसे कि सीपी, एमवी, आरएम, टार, आरएसक्यूएनसी, एसपीपी ...) द्वारा किया जाना था, तो प्रयास का एक बड़ा दोहराव होगा। इसके बजाय, ऐसी चीजों को ग्लोबिंग के हिस्से के रूप में किया जा सकता है , अर्थात आपके शेल द्वारा।
man 1 bash
, / बहिर्गमन ।
उदाहरण:
$ दुकान -s एक्सग्लोब $ प्रतिध्वनि चित्र / * छवियाँ / 004.bmp चित्र / 033.jpg चित्र / 1276338351183.jpg चित्र / 2252. $ प्रतिध्वनि चित्र /! (*। jpg) छवियों / 004.bmp छवियों / 2252. पीएनजी
तो आप सिर्फ एक पैटर्न अंदर रखते हैं !()
, और यह मैच को नकारता है। पैटर्न मनमाने ढंग से जटिल हो सकता है, व्यक्तिगत पथों की गणना से शुरू हो सकता है (जैसा कि वानवारिल एक अन्य उत्तर में दिखाता है):, !(filename1|path2|etc3)
सितारों और चरित्र वर्गों के साथ चीजों की तरह फिर से जुड़ना । विवरण के लिए मैनपेज देखें।
man 1 zshexpn
, / फ़ाइल नाम पीढ़ी ।
आप setopt KSH_GLOB
बैश-जैसे पैटर्न का उपयोग और कर सकते हैं । या,
% EXTENDED_GLOB सेट करें % प्रतिध्वनि चित्र / * छवियाँ / 004.bmp चित्र / 033.jpg चित्र / 1276338351183.jpg चित्र / 2252. % प्रतिध्वनि चित्र / * ~ * .jpg छवियों / 004.bmp छवियों / 2252. पीएनजी
तो x~y
पैटर्न से मेल खाता है x
, लेकिन पैटर्न को बाहर करता है y
। एक बार फिर, पूरे विवरण के लिए मैनपेज देखें।
मछली खोल एक है बहुत खूबसूरत जवाब यह करने के लिए:
🐟 cp (स्ट्रिंग मैच -v '* * .excluded.names' - srcdir / *) डिडिर
टाइप करें cp *
, हिट करें CtrlX*और देखें कि क्या होता है। यह हानिकारक नहीं है मैं वादा करता हूँ
zsh
हालांकि में काम करता है ।
setopt -u extglob
।
rsync
जब आप कर सकते हैं तो उपयोग क्यों करें :
find . -type f -not -iname '*/not-from-here/*' -exec cp '{}' '/dest/{}' ';'
यह लक्ष्य निर्देशिका संरचना को स्रोत के समान ही मानता है।
-path
पथ पदानुक्रम का परीक्षण करने के लिए तर्क की आवश्यकता है , नहीं -नाम
find . -type f -not -path '*/not-from-here/*' -exec cp '{}' '/dest/{}' \;
rsync
? Coz यह प्रणाली में मौजूद नहीं हो सकता है! जबकि find
, cp
हमेशा अपने स्थानों पर है। या आप ऐसे लोगों से हैं, जिन्होंने साधारण चीजें करने के लिए 2gigs सामान स्थापित किया है?
cp -r `ls -A | grep -v "c"` $HOME/
# $1 = source path # $2 = destination path # $3 = filter copy_from_source_to_destination_except_filter() { cp -r $(ls -A $1 | grep -v -w $3 | awk -v path=$1 '{printf "%s/%s ", path, $1}') $2 }
सबसे आसान तरीका मैंने पाया, जहाँ आप केवल कोष्ठकों में अपना नाम जोड़कर फाइलों और फ़ोल्डरों को छोड़कर सभी फाइलों को कॉपी कर सकते हैं:
shopt -s extglob
cp -r !(Filename1 | FoldernameX | Filename2) Dest/
-bash: !: event not found
एमवीडीएस की टिप्पणी पर विस्तार करते हुए , यह मेरे लिए काम करता है
cd dotfiles
tar -c --exclude .git --exclude README . | tar -x -C ~/dotfiles2
यह स्रोत निर्देशिका के सापेक्ष है।
यह निर्देशिका source/.git
को कॉपी होने से बाहर कर देगा ।
rsync -r --exclude '.git' source target
rsync
rsync -r --verbose --exclude 'exclude_pattern' ./* /to/where/
और पहले यह देखने के लिए एक विकल्प के साथ प्रयास करें कि क्या कॉपी किया जा रहा है
मुझे लगता है कि आप बैश या डैश का उपयोग कर रहे हैं। क्या यह काम करेगा?
shopt -s extglob # sets extended pattern matching options in the bash shell
cp $(ls -laR !(subdir/file1|file2|subdir2/file3)) destination
उन फ़ाइलों को छोड़कर, जो आप नहीं चाहते हैं, और cp के लिए पहले तर्क के रूप में उपयोग करते हुए एक ls करना
ls
और बस कर सकते हैं cp !(file1|file1) dest
।
cp $(ls folder/!exclude_folder0|exclude_folder1)) dest
rsync
वास्तव में काफी मुश्किल है। इसे काम करने के लिए कई परीक्षण करने होंगे।
चलो आप कॉपी करना चाहते कहना /var/www/html
करने के लिए /var/www/dev
, लेकिन करने की आवश्यकता को बाहर /var/www/html/site/video/
अपने आकार के कारण हो सकता है निर्देशिका। आदेश होगा:
rsync -av --exclude 'sites/video' /var/www/html/ /var/www/dev
कुछ चेतावनी :
/
स्रोत में अंतिम स्लैश की आवश्यकता है, अन्यथा यह अपनी सामग्री के बजाय स्रोत निर्देशिका को भी कॉपी करेगा और बन जाता है /var/www/dev/html/xxxx
, जो शायद आप नहीं चाहते हैं।--exclude
मार्ग है रिश्तेदार स्रोत सीधे करने के लिए। यहां तक कि अगर आप पूर्ण निरपेक्ष मार्ग डालते हैं, तो भी यह काम नहीं करेगा।
-v
वर्बोज़ के लिए -a
है, संग्रह मोड के लिए है जिसका अर्थ है कि आप पुनरावर्तन चाहते हैं और लगभग सब कुछ संरक्षित करना चाहते हैं।
cp -rv `ls -A | grep -vE "dirToExclude|targetDir"` targetDir
संपादित करें: लक्ष्य पथ को भी बाहर करना भूल गया (अन्यथा यह पुनरावर्ती रूप से कॉपी हो जाएगा)।
यह लिनुस क्लेन के उत्तर का एक संशोधन है। उसका जवाब मेरे काम नहीं आया क्योंकि वहाँ एक होगा। फ़ाइल पथ के सामने जोड़ा गया है जो cp को पसंद नहीं है (पथ स्रोत / .destination / फ़ाइल की तरह दिखेगा)।
इस कमांड ने मेरे लिए काम किया:
find . -type f -not -path '*/exlude-path/*' -exec cp --parents '{}' '/destination/' \;
--parents कमांड डायरेक्टरी स्ट्रक्चर को संरक्षित करती है।
बस इसे एक छिपी निर्देशिका में अस्थायी रूप से स्थानांतरित करें (और यदि इसके बाद नाम बदलना है, तो)।
mkdir .hiddendir
cp * .hiddendir -R
mv .hiddendir realdirname
cp
एक मानक POSIX शेल के साथ काम करता है sh
।
मैं खोज कमांड के आउटपुट को पढ़ने के लिए "डू जबकि" लूप का उपयोग करता हूं। इस उदाहरण में, मैं कुछ पैटर्न से मिलान कर रहा हूँ (बल्कि बाहर करने के बजाय) क्योंकि मैं चाहता हूँ कि मैं चाहता हूँ की तुलना में अधिक पैटर्न मैच की एक सीमित संख्या में हैं। आप -iname झंडे के सामने एक नोट के साथ तर्क को उल्टा कर सकते हैं:
find . -type f -iname "*.flac" -o -print0 -iname "*.mp3" -print0 -o -iname "*.wav" -print0 -o -iname "*.aac" -print0 -o -iname "*.wma" -print0 | while read -d $'\0' file; do cp -ruv "$file" "/media/wd/network_sync/music/$file"; done
मैं उपरोक्त सभी संगीत प्रकार की फ़ाइलों को कॉपी करने के लिए उपयोग करता हूं जो मेरे सर्वर पर एक पश्चिमी डिजिटल टीवी लाइव हब की फ़ाइलों की तुलना में नए हैं जो मैंने / मीडिया / wd पर आरोहित किए हैं। मैं ऊपर का उपयोग करता हूं क्योंकि मेरे पास बहुत सारी डीवीडी फाइलें, एमपीईजी आदि हैं, जिन्हें मैं बाहर करना चाहता हूं और क्योंकि किसी कारणवश rsync ऐसा लगता है कि यह नकल कर रहा है, लेकिन मैं wd डिवाइस को देखने के बाद, फाइलें नहीं होने के बावजूद नहीं हैं इस आदेश के साथ rsync के दौरान त्रुटियाँ:
rsync -av --progress --exclude=*.VOB --exclude=*.avi --exclude=*.mkv --exclude=*.ts --exclude=*.mpg --exclude=*.iso --exclude=*ar --exclude=*.vob --exclude=*.BUP --exclude=*.cdi --exclude=*.ISO --exclude=*.shn --exclude=*.MPG --exclude=*.AVI --exclude=*.DAT --exclude=*.img --exclude=*.nrg --exclude=*.cdr --exclude=*.bin --exclude=*.MOV --exclude=*.goutputs* --exclude=*.flv --exclude=*.mov --exclude=*.m2ts --exclude=*.cdg --exclude=*.IFO --exclude=*.asf --exclude=*.ite /media/2TB\ Data/data/music/* /media/wd/network_sync/music/
ls -I "filename1" -I "filename2" | xargs cp -rf -t destdir
पहला भाग ls
सभी फाइलों को लेकिन ध्वज के साथ छिपी विशिष्ट फाइलों को -I
। का आउटपुट ls
दूसरे भाग के लिए मानक इनपुट के रूप में उपयोग किया जाता है। मानक इनपुट से xargs
कमांड बनाएँ और निष्पादित करें cp -rf -t destdir
। ध्वज का -r
अर्थ है प्रतिलिपि निर्देशिकाओं की पुनरावृत्ति, -f
इसका मतलब है कि फ़ाइलों को जबरन कॉपी करें जो फाइलों को अधिलेखित कर देंगे destdir
, -t
गंतव्य निर्देशिका प्रतिलिपि को निर्दिष्ट करेंगे।
cp -r ls -A | grep -v "Excluded_File_or_folder"
../tartarget_location -v