मैं एक विशिष्ट उप-निर्देशिका में कुछ फ़ाइलों को छोड़कर एक निर्देशिका में सभी फ़ाइलों को कॉपी करना चाहता हूं। मैंने देखा है कि '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सापेक्ष है ।sourcefoldersourcefolder/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