सवाल स्रोत फ़ाइल मौजूद नहीं होने पर 'cp' कमांड को त्रुटि कैसे नहीं आती है?


मैं मैक ओएस एक्स का उपयोग कर रहा हूँ। मैं इस तरह की एक निर्माण स्क्रिप्ट के लिए सीपी कमांड के साथ कुछ फाइलों की प्रतिलिपि बनाने की कोशिश कर रहा हूं।

cp ./src/*/*.h ./aaa

लेकिन ./src निर्देशिका में कोई .h फ़ाइल नहीं है, तो यह आदेश एक त्रुटि को सक्रिय करता है। आदेश कैसे कम करें त्रुटि त्रुटि नहीं है? (चुप विफलता) त्रुटि निर्माण परिणाम विफल हो जाती है, लेकिन मैं केवल प्रतिलिपि बनाना चाहता हूं जब केवल कुछ शीर्षलेख फ़ाइल हों।


42
2018-06-23 02:55


मूल




जवाब:


यदि आप त्रुटि संदेश के बारे में बात कर रहे हैं, तो आप इसे बिट बाल्टी पर भेजकर दबा सकते हैं:

cp ./src/*/*.h ./aaa 2>/dev/null

अगर आप निकास कोड और त्रुटि संदेश को दबाना चाहते हैं:

cp ./src/*/*.h ./aaa 2>/dev/null || :

56
2018-06-23 04:07



क्या समझाओ यह अच्छा होगा : इस संदर्भ में मतलब है। - Piotr Dobrogost
@PiotrDobrogost: बैश और कुछ अन्य गोले में कोलन एक शून्य उपयोगिता (नो-ऑप) है। आईटी इस निर्दिष्ट द्वारा POSIX। चूंकि यह हमेशा सत्य लौटाता है, इसलिए इसका उपयोग असफल के निकास कोड को दबाने के लिए किया जाता है cp (वांछित होना चाहिए)। खोल बनाया गया true इसके बजाय इस्तेमाल किया जा सकता है और अधिक पठनीय होगा। - Dennis Williamson
के बारे में अधिक : - ':' (कोलन) जीएनयू बैश बिल्टिन का उद्देश्य क्या है? - Piotr Dobrogost
यह अन्य त्रुटियों को भी अनदेखा कर देगा (स्रोत / गंतव्य निर्देशिका मौजूद नहीं है, स्रोत फ़ाइल मौजूद है लेकिन पठनीय नहीं है, डिस्क पूर्ण, केवल-पढ़ने वाली फाइल सिस्टम, आईओ त्रुटि, cp अंदर नहीं PATH जैसे तैसे...) - Vladimir Panteleev


आप कुछ के साथ कुछ खोज रहे हैं

if [ -e file ]
 then cp file /somewhere
fi

(दुर्भाग्य से -f विकल्प वह Droid नहीं है जिसे आप ढूंढ रहे हैं।)

यदि आप एक ग्लोब से मेल खाना चाहते हैं, तो यह काम नहीं करेगा; उपयोग find इसके बजाए, उदा .:

find ./src -name \*.h -exec cp {} ./destination \;

10
2018-06-23 03:19



ध्यान दें कि इस तरह के दृष्टिकोण के साथ एक संभावित टोकोउ मुद्दा है (उदाहरण के लिए यदि आप उपयोग करते हैं set -e, और फ़ाइल के बीच गायब हो जाती है [ और यह cp invocations, आपकी लिपि दुर्घटनाग्रस्त हो जाएगा)। - Vladimir Panteleev


पुराना सवाल, लेकिन फिर भी दूसरों के लिए प्रासंगिक हो सकता है।
यदि आप नहीं करते हैं जरुरत सीपी का उपयोग करने के लिए, आप rsync के साथ कोशिश कर सकते हैं।
किसी स्रोत से किसी गंतव्य निर्देशिका में सभी फ़ाइलों की प्रतिलिपि बनाने के लिए, चलाएं:

rsync -avzh --ignore-errors /path/to/source /path/to/destination

रिनिंक अधिकांश यूनिक्स जैसी प्रणालियों जैसे लिनक्स, मैक ओएस एक्स या फ्रीबीएसडी के साथ आता है।


7
2017-08-22 16:22



आप पैरामीटर जोड़कर, सीपी के बजाय rsync का उपयोग कर सकते हैं --ignore-missing-args: rsync -av --ignore-missing-args ./src/*/*.h ./aaa इसका लाभ है --ignore-errors कि केवल अनदेखी त्रुटियां स्रोत फ़ाइलों से संबंधित हैं जो मौजूदा नहीं हैं। साथ में --ignore-errors हर त्रुटि को नजरअंदाज कर दिया जाता है, जो खतरनाक हो सकता है। साथ ही, ध्यान रखें कि यह पैरामीटर काफी हाल ही में है, इसलिए यह rsync के पुराने संस्करणों में मौजूद नहीं हो सकता है। - jesjimher


परिणाम को सही तरीके से पिप करना सुनिश्चित करता है कि आदेश हमेशा सफल रहेगा। मैंने लिनक्स पर यह कोशिश की है लेकिन किसी भी मैक ओएस पर नहीं:

cp ./src/*/*.h ./aaa | true

5
2018-02-06 16:41



सरल पाइप | हमेशा चल रहा है || केवल एक त्रुटि के मामले में किया जाता है। तथा true आमतौर पर एक बाइनरी है जबकि कोलन : एक बिल्टिन है और पीआईडी ​​का उपभोग नहीं करता है। - ott--
मैकोज़ पर एक बैश स्क्रिप्ट - "cp ./src/*/*.h ./aaa" कमांड वाला योसमेट त्रुटि नहीं करता है यदि .h फ़ाइलें मौजूद नहीं हैं। - Vivek


आप सही त्रुटि स्थिति को मजबूर कर सकते हैं। एक समारोह के साथ:

$ cpalways () { cp $1 $2 2>/dev/null ; return 0 ; }

निम्नलिखित को देखते हुए:

$ ls foo bar baz
ls: baz: No such file or directory
bar foo

नियमित प्रतिलिपि एक त्रुटि लौटाएगी। यह 1 की निकास स्थिति वापस कर देगा।

$ cp baz bar ; echo $?
cp: baz: No such file or directory
1

यदि हम उपरोक्त cpalways () फ़ंक्शन का उपयोग करते हैं, तो कोई भी त्रुटि छिपी जाएगी:

$ cpalways baz bar ; echo $?
0
$ cpalways foo bar ; echo $?
0
$ cpalways baz bar ; echo $?
0

1
2018-06-23 04:12