किसी विशिष्ट निर्देशिका को बाहर करने के लिए 'cp' कमांड का उपयोग कैसे करें?


410

मैं एक विशिष्ट उप-निर्देशिका में कुछ फ़ाइलों को छोड़कर एक निर्देशिका में सभी फ़ाइलों को कॉपी करना चाहता हूं। मैंने देखा है कि 'cp' कमांड में एक --exclude विकल्प नहीं था। तो, मैं इसे कैसे प्राप्त कर सकता हूं?



6
tar -c | tar -x?
16

1
@mvds, आपके साथ सहमत हैं, '--exclude' के साथ टार का उपयोग करना एक अच्छा विचार है।
हुआंग एफ। लेई

जवाबों:


702

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कमांड लाइन से हटा दें ।


3
सहमत, आप सादगी और शक्ति को हरा नहीं सकते हैं--exclude
मैथ्यू विलकोक्सन

31
या वर्तमान काम कर रहे व्यक्ति के thefoldertoexcludeसापेक्ष है sourcefolder? धन्यवाद
बीबी

46
यह स्रोत फ़ोल्डर के सापेक्ष है। यह फ़ोल्डर स्रोत / .it को कॉपी किए जाने से बाहर कर देगा। rsync -r --exclude '.git' स्रोत का लक्ष्य
orkoden

15
शायद मैं गलत हूं, लेकिन मुझे लगता है कि "पैरामीटर" से पहले "स्विच" जोड़ना एक अच्छा अभ्यास है। इसके अलावा rsync रिपोर्ट का मैन पेज - "=" सिंटैक्स के साथ या इसके बिना उपयोग करने योग्य है। इसलिए ऑपरेटिंग सिस्टम के पार जाने के लिए, मैं उपयोग करूँगा rsync -av --progress --exclude="thefoldertoexclude" sourcefolder /destinationfolder- वैसे भी rsync के लिए खोज के बजाय upvote, क्योंकि आप आसानी से स्रोत के लिए निरपेक्ष पथ का उपयोग कर सकते हैं, जबकि खोजने में यह पेचीदा है क्योंकि यह {}dst में उपयोग करता है ।
ज़ावी मोंटेरो

1
@ मानमुनि जैसे कि रिमोट सर्वर से लोकल मशीन तक: $ rsync user@example.com:/var/www/mypage /var/www/mylocalpage/या लोकल से रिमोट के लिए$ rsync /var/www/mylocalpage/ user@example.com:/var/www/mypage
sobi3ch

84

ठीक है, अगर कुछ फ़ाइल नाम पैटर्न का बहिष्करण हर यूनिक्स-ईश फ़ाइल उपयोगिता (जैसे कि सीपी, एमवी, आरएम, टार, आरएसक्यूएनसी, एसपीपी ...) द्वारा किया जाना था, तो प्रयास का एक बड़ा दोहराव होगा। इसके बजाय, ऐसी चीजों को ग्लोबिंग के हिस्से के रूप में किया जा सकता है , अर्थात आपके शेल द्वारा।

दे घुमा के

man 1 bash, / बहिर्गमन

उदाहरण:

$ दुकान -s एक्सग्लोब
$ प्रतिध्वनि चित्र / *
छवियाँ / 004.bmp चित्र / 033.jpg चित्र / 1276338351183.jpg चित्र / 2252.
$ प्रतिध्वनि चित्र /! (*। jpg)
छवियों / 004.bmp छवियों / 2252. पीएनजी

तो आप सिर्फ एक पैटर्न अंदर रखते हैं !(), और यह मैच को नकारता है। पैटर्न मनमाने ढंग से जटिल हो सकता है, व्यक्तिगत पथों की गणना से शुरू हो सकता है (जैसा कि वानवारिल एक अन्य उत्तर में दिखाता है):, !(filename1|path2|etc3)सितारों और चरित्र वर्गों के साथ चीजों की तरह फिर से जुड़ना । विवरण के लिए मैनपेज देखें।

zsh

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*और देखें कि क्या होता है। यह हानिकारक नहीं है मैं वादा करता हूँ


@MikhailGolubtsov शायद इसलिए कि ग्लोबिंग पुनरावर्ती नहीं है और एक समय में एक स्तर पर काम करता है। संपादित किया गया। पुनश्च: यह zshहालांकि में काम करता है ।
ulidtko

3
अच्छा समर्थक टिप! इस तरह आप सिंगल आइटम को आसानी से हटा सकते हैं। आपका बहुत बहुत धन्यवाद!
तड़के

बीटीडब्ल्यू, बाश में विस्तारित पैटर्न मिलान सुविधाओं को बंद करने के लिए, चलाएं setopt -u extglob
रॉकलाईट

49

rsyncजब आप कर सकते हैं तो उपयोग क्यों करें :

find . -type f -not -iname '*/not-from-here/*' -exec cp '{}' '/dest/{}' ';'

यह लक्ष्य निर्देशिका संरचना को स्रोत के समान ही मानता है।


8
मुझे लगता है कि आपको -pathपथ पदानुक्रम का परीक्षण करने के लिए तर्क की आवश्यकता है , नहीं -नाम
जेम्स मूर्ति

3
और आपको अंत में एक अर्ध- find . -type f -not -path '*/not-from-here/*' -exec cp '{}' '/dest/{}' \;
उपनिवेश

1
वाह, यह मुझे नहीं होने देगा: "संपादन कम से कम 6 वर्ण होना चाहिए"!
मैथ्यू विलकॉक्सन

1
@ मैथ्यू विल्कॉक्सन मेह। उन प्रतिबंधों को हटा दिया जाएगा, जैसे ही आप थोड़ा और प्रतिनिधि प्राप्त करेंगे। मैंने तदनुसार उत्तर संपादित किया। एक बार फिर धन्यवाद!
लिनस क्लेन

1
@ क्यों नहीं rsync? Coz यह प्रणाली में मौजूद नहीं हो सकता है! जबकि find, cpहमेशा अपने स्थानों पर है। या आप ऐसे लोगों से हैं, जिन्होंने साधारण चीजें करने के लिए 2gigs सामान स्थापित किया है?
Reishin

37
cp -r `ls -A | grep -v "c"` $HOME/

1
विंडोज 10 .sh में मेरे लिए काम किया
atwellpub

एक शेल फ़ंक्शन बनाया, जो कस्टम स्रोत पथ और सिर्फ एक फ़ाइल या निर्देशिका के बहिष्करण के लिए उपयोग को सरल करता है: # $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 }
ElectRocnic

रिक्त स्थान के साथ निर्देशिकाओं में विफल रहता है
Sérgio

27

सबसे आसान तरीका मैंने पाया, जहाँ आप केवल कोष्ठकों में अपना नाम जोड़कर फाइलों और फ़ोल्डरों को छोड़कर सभी फाइलों को कॉपी कर सकते हैं:

shopt -s extglob
cp -r !(Filename1 | FoldernameX | Filename2) Dest/

9
मेरे लिए काम नहीं करता है। मुझे मिलता है-bash: !: event not found
जिनेरामा

8
shopt -s extglob (इसे सक्षम करने के लिए निष्पादित करें! cp, rm और अन्य में)
imkost



8

rsync

rsync -r --verbose --exclude 'exclude_pattern' ./* /to/where/

और पहले यह देखने के लिए एक विकल्प के साथ प्रयास करें कि क्या कॉपी किया जा रहा है


शीर्ष उत्तर की तुलना में क्या अंतर / सुधार है?
गतिविधि कम करना

7

मुझे लगता है कि आप बैश या डैश का उपयोग कर रहे हैं। क्या यह काम करेगा?

shopt -s extglob  # sets extended pattern matching options in the bash shell
cp $(ls -laR !(subdir/file1|file2|subdir2/file3)) destination

उन फ़ाइलों को छोड़कर, जो आप नहीं चाहते हैं, और cp के लिए पहले तर्क के रूप में उपयोग करते हुए एक ls करना


9
आप अतिरिक्त को छोड़ सकते हैं lsऔर बस कर सकते हैं cp !(file1|file1) dest
शॉन चिन

-LR का प्रयोग न करें। यह स्ट्रिंग है जो cp के साथ हस्तक्षेप करता है। cp $(ls folder/!exclude_folder0|exclude_folder1)) dest
LAL

5

एक और सरल विकल्प rsync को स्थापित और उपयोग करना है जिसमें एक --exclude-dir विकल्प है, और इसका उपयोग स्थानीय और दूरस्थ दोनों फ़ाइलों के लिए किया जा सकता है।


4

rsyncवास्तव में काफी मुश्किल है। इसे काम करने के लिए कई परीक्षण करने होंगे।

चलो आप कॉपी करना चाहते कहना /var/www/htmlकरने के लिए /var/www/dev, लेकिन करने की आवश्यकता को बाहर /var/www/html/site/video/ अपने आकार के कारण हो सकता है निर्देशिका। आदेश होगा:

rsync -av --exclude 'sites/video' /var/www/html/ /var/www/dev

कुछ चेतावनी :

  1. /स्रोत में अंतिम स्लैश की आवश्यकता है, अन्यथा यह अपनी सामग्री के बजाय स्रोत निर्देशिका को भी कॉपी करेगा और बन जाता है /var/www/dev/html/xxxx, जो शायद आप नहीं चाहते हैं।
  2. --excludeमार्ग है रिश्तेदार स्रोत सीधे करने के लिए। यहां तक ​​कि अगर आप पूर्ण निरपेक्ष मार्ग डालते हैं, तो भी यह काम नहीं करेगा।

  3. -vवर्बोज़ के लिए -aहै, संग्रह मोड के लिए है जिसका अर्थ है कि आप पुनरावर्तन चाहते हैं और लगभग सब कुछ संरक्षित करना चाहते हैं।


एक सरल समाधान जो विशेष वर्णों और सफेद रिक्त स्थान की देखभाल करता है
Sérgio

वर्तमान शीर्ष उत्तर के विपरीत, मापदंडों को समझाने के लिए धन्यवाद!
गतिविधि

3
cp -rv `ls -A | grep -vE "dirToExclude|targetDir"` targetDir

संपादित करें: लक्ष्य पथ को भी बाहर करना भूल गया (अन्यथा यह पुनरावर्ती रूप से कॉपी हो जाएगा)।


4
रिक्त स्थान वाली निर्देशिका प्रविष्टियों के लिए बाहर देखो।
पाउलो स्कार्डिन 16

3

यह लिनुस क्लेन के उत्तर का एक संशोधन है। उसका जवाब मेरे काम नहीं आया क्योंकि वहाँ एक होगा। फ़ाइल पथ के सामने जोड़ा गया है जो cp को पसंद नहीं है (पथ स्रोत / .destination / फ़ाइल की तरह दिखेगा)।

इस कमांड ने मेरे लिए काम किया:

find . -type f -not -path '*/exlude-path/*' -exec cp --parents '{}' '/destination/' \;

--parents कमांड डायरेक्टरी स्ट्रक्चर को संरक्षित करती है।


2

बस इसे एक छिपी निर्देशिका में अस्थायी रूप से स्थानांतरित करें (और यदि इसके बाद नाम बदलना है, तो)।

mkdir .hiddendir
cp * .hiddendir -R
mv .hiddendir realdirname

1
शायद बहुत सुंदर नहीं है - लेकिन यह एकमात्र विकल्प है जो मैंने यहां पाया है जो cpएक मानक POSIX शेल के साथ काम करता है sh
टोमेक्वी

1
यह उत्तर नाटकीय रूप से कमतर है। यह सबसे संगत, पढ़ने में आसान और जवाब समझने में आसान है। कुदोस, मुझे नहीं पता कि मैंने इसके बारे में क्यों नहीं सोचा।
रॉबर्ट तलाडा

धन्यवाद @RobertTalada, अब कितनी दूर से उत्तर जाएगा? कल
lama12345


0

मैं खोज कमांड के आउटपुट को पढ़ने के लिए "डू जबकि" लूप का उपयोग करता हूं। इस उदाहरण में, मैं कुछ पैटर्न से मिलान कर रहा हूँ (बल्कि बाहर करने के बजाय) क्योंकि मैं चाहता हूँ कि मैं चाहता हूँ की तुलना में अधिक पैटर्न मैच की एक सीमित संख्या में हैं। आप -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/

0
ls -I "filename1" -I "filename2" | xargs cp -rf -t destdir 

पहला भाग lsसभी फाइलों को लेकिन ध्वज के साथ छिपी विशिष्ट फाइलों को -I। का आउटपुट lsदूसरे भाग के लिए मानक इनपुट के रूप में उपयोग किया जाता है। मानक इनपुट से xargsकमांड बनाएँ और निष्पादित करें cp -rf -t destdir। ध्वज का -rअर्थ है प्रतिलिपि निर्देशिकाओं की पुनरावृत्ति, -fइसका मतलब है कि फ़ाइलों को जबरन कॉपी करें जो फाइलों को अधिलेखित कर देंगे destdir, -tगंतव्य निर्देशिका प्रतिलिपि को निर्दिष्ट करेंगे।


हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.