कैसे कुछ कॉपी करने के लिए, लेकिन सभी फ़ाइलों को नहीं?


54

इसलिए, आप किसी निर्देशिका के संदर्भ में *उपयोग करते समय सभी फ़ाइलों के लिए वाइल्ड कार्ड के रूप में उपयोग कर सकते हैं cp। क्या xफ़ाइल को छोड़कर सभी फ़ाइलों को कॉपी करने का एक तरीका है ?

जवाबों:


42

में bashआप उपयोग कर सकते हैं extglob:

 $ shopt -s extglob  # to enable extglob
 $ cp !(b*) new_dir/

जहाँ !(b*)सभी b*फाइलों को बाहर रखा गया है ।

आप बाद में इसके extglobसाथ अक्षम कर सकते हैं

 $ shopt -u extglob

क्या आपको पता है कि tcsh शेल के लिए कुछ समान है?
लेवॉन

दुर्भाग्य से मैं नहीं। लगता है जैसे findएक ही रास्ता है tcsh:find . -maxdepth 1 ! -name "exclude*" -exec cp -t destination {} \+
भीड़

50

Rsync इसे अच्छी तरह से संभालता है।

उदाहरण की प्रतिलिपि सभी: rsync -aP /folder1/* /folder/2

उदाहरण बहिष्करण के साथ सभी को कॉपी करें: rsync -aP --exclude=x /folder1/* /folder2/

-aPस्विच:

a: के समान cp -a, पुनरावर्ती, आदि P: प्रगति दिखाता है, rsync की एक अच्छी विशेषता है।


5
और सामान्य rsync बहिष्करण सूचियों के लिए एक संक्षिप्त मार्गदर्शिका के लिए इस उत्तर को देखें ।
गाइल्स का SO- बुराई से रोकना '

1
यदि आप पुनरावृत्ति करना चाहते हैं -rP, -aPतो डार्विन / मैकओएस पर उपयोग करें । -aसंग्रह के लिए है। यकीन नहीं होता कि यह बदल गया है या अगर यह मैकओएस पर अलग है।
jpoveda

rsyncइसे पुनरावर्ती बनाने का विकल्प है। उदाहरण: rsync --recursive -P --exclude=x /folder1/* /folder2/। (केवल उबंटू पर परीक्षण किया गया)
n1k31t4

12

यह एक विशेषता नहीं है cp, यह आपके शेल की एक विशेषता है (इसका *मतलब सभी गैर-डॉट फ़ाइलों से है), इसलिए उत्तर इस बात पर निर्भर करता है कि आप किस शेल का उपयोग कर रहे हैं। उदाहरण के लिए, zshइस सिंटैक्स का समर्थन करता है:

$ cp ^x /path/to/destination

जहां ^x"सभी फ़ाइलों को छोड़कर x" का अर्थ है

आप चयन और डी-चयन पैटर्न को भी जोड़ सकते हैं, उदाहरण के लिए xyz वाले सभी wav फ़ाइलों को कॉपी करने के लिए, जिनका आप उपयोग कर सकते हैं:

cp *.wav~*xyz*

किसी भी टिप्पणी पर bash?
चाड हैरिसन

@hydroparadise मैं पार्टी के बारे में ज्यादा पता नहीं है, लेकिन क्या यह उत्तर इसे कवर करने लगता है
माइकल Mrozek

Tcsh के बारे में क्या? किसी को पता है?
लेवॉन

4

उन्नत शेल ग्लोबिंग या कमांड-इन-एक्सक्लूज़न विकल्पों के साथ कमांड का उपयोग करने की तुलना में बहुत कम सुरुचिपूर्ण तरीके से मानक उपकरणों के साथ विभिन्न तरीकों से सादे पुराने (पोर्टेबल / संगत) बोर्न शेल में भी किया जा सकता है।

यदि बहुत अधिक फाइलें नहीं हैं (और रिक्त स्थान और / या लाइनब्रेक सहित नामों के साथ नहीं), तो यह एक तरीका हो सकता है:

cp `ls | egrep -v '^excludename$'` destdir/.

ज़रूर, bashऔर GNU उपकरण महान और शक्तिशाली हैं, लेकिन वे अभी भी हमेशा उपलब्ध नहीं हैं। यदि आप इसे एक पोर्टेबल स्क्रिप्ट में रखने का इरादा रखते हैं, तो मैं findरश द्वारा टिप्पणी के रूप में सुझाऊंगा।


2
मुझे लगता है कि आपके उत्तर का अंतिम भाग केवल विषय से विचलित होता है। इसके अलावा, "यूनिक्स" अब सोने का मानक नहीं है (यदि यह कभी भी था)। इस साइट का शीर्षक "यूनिक्स और लिनक्स" होने के बावजूद यह अभी प्रासंगिक नहीं है कि कुछ "यूनिक्स" है या नहीं।
अलेक्जेंडर

2
ठीक। मैंने टिप्पणी को यहां स्थानांतरित किया: यूनिक्स जीएनयू नहीं है। मैं इस बात से सहमत हूं कि चीजों की "असमानता" बहुत दिलचस्प नहीं है, लेकिन मैं अभी भी पोर्टेबिलिटी और अपने इतिहास के बारे में थोड़ा जानने में विश्वास करता हूं।
मैटबियनको

वहां आपसे पूरी तरह सहमत हूं।
अलेक्जेंडर

2

यदि आप किसी विशेष उप-निर्देशिका में सब कुछ फ़ोल्डर में (सबफ़ोल्डर सहित) कॉपी करना चाहते हैं:

cp -R $(ls | grep -v '^subdir$') subdir/

श, बाश, zsh (कम से कम) के साथ काम करता है।


1
मुझे यकीन है कि यह वही नहीं है जैसे किcp -R * subdir/
23

1
यदि आप उस कमांड "cp -R * सबडिर /" का उपयोग करते हैं, तो bash / zsh ने 'subdir' को पुनरावृत्ति रूप से कॉपी करने की कोशिश की। आप एक त्रुटि के साथ समाप्त होते हैं: "नाम बहुत लंबा (प्रतिलिपि नहीं)"।
user2707671

अच्छी बात। आपका सुझाव चेतावनी से बचने का प्रयास करता है cp( bash/ से नहीं sh), " cp: cannot copy a directory, ‘subdir’, into itself, ‘subdir/subdir’"। प्रतिलिपि सही ढंग से पूरा करती है, यद्यपि। दुर्भाग्य से आपका वैरिएंट किसी भी फ़ाइल नाम के साथ टूट जाता है जिसमें एक स्थान या शेल-संवेदनशील विराम चिह्न होता है। देखें unix.stackexchange.com/q/128985/135943
roaima

-1

extglob सबसे अच्छा तरीका है अब तक मुझे लगता है।

एक और तरीका उपयोग कर रहा है cp $(ls --ignore=x) subdir/


यह फिल्नाम में जो भी विशेष वर्ण है, किसी भी रूप को तोड़ देगा। (रिक्त स्थान, newlines, $आदि) का उत्पादन कभी नहीं पार्स lsunix.stackexchange.com/q/128985/135943
Wildcard
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.