क्या व्यक्त करने का एक तरीका है: `- link 'या cp में साधारण प्रतिलिपि पर वापस गिरना (GNU कोरुटिल्स से)?


11

वहाँ (यानी हार्ड लिंक बनाने के लिए) बताने के cpलिए एक रास्ता है --link, लेकिन मैं अंतर-डिवाइस हार्डलिंक कोशिश कर रहा हूँ, जहां मामले में वापस आ गया? इंटर-डिवाइस लिंक संभव नहीं हैं और यह cpविफल हो जाएगा।

मैं जो पूछ रहा हूं, वह इसलिए है क्योंकि मैं इस का उपयोग करना चाहूंगा GNUmakefileऔर कुछ विवादास्पद और लंबे समय तक (या एक फ़ंक्शन, उस मामले के लिए) पर एक पठनीय कमांड लाइन पसंद करूंगा।

सवाल जीएनयू कोरुटिल्स (7.4 और 8.13) के लिए है।

नोट: अभी वर्कअराउंड कुछ ऐसा होगा (GNU रेसिपी सिंटैक्स):

cp -fl $^ $@ || cp -f $^ $@

यह निश्चित रूप से अंतर-डिवाइस लिंक के मामले में सहज त्रुटि संदेश देगा, हालांकि दूसरे cpकॉल पर सफल रहा । इसके अलावा, फिर इसका विस्तार हो जाता है (स्रोत प्रपत्र सभी के बाद पठनीय दिखता है) यह अब भी पठनीय नहीं होगा।

जवाबों:


8

cpयह विकल्प नहीं है। आप एक आवरण स्क्रिप्ट लिख सकते हैं, लेकिन यह बहुत सरल है।

ln -f $^ $@ 2>/dev/null || cp -f $^ $@

जीएनयू कोरुटिल्स 7.5 ने --reflinkविकल्प पेश किया । यदि आप पास होते हैं --reflink=autoऔर अंतर्निहित फाइल सिस्टम कॉपी-ऑन-राइट (जैसे Btrfs या ZFS) का समर्थन करता है और कॉपी एक ही डिवाइस पर होती है, तो cpएक नया इनोड बनाएगा , लेकिन सामग्री की नकल नहीं करेगा; अन्यथा cpएक सामान्य प्रतिलिपि बनाता है। यह अभी भी एक कड़ी नहीं है (लक्ष्य हमेशा एक अलग इनोड होगा), लेकिन यह शायद आपके उपयोग के मामले के लिए भी बेहतर है। हालाँकि, अगर आप ext4 पर हैं (आजकल ज्यादातर लोगों की तरह), जो कॉपी-ऑन-राइट का समर्थन नहीं करता है, तो यह आपकी मदद नहीं करेगा।


1
धन्यवाद, $$मेरे मामले में डबल बेशक है क्योंकि यह एक मैक्रो के अंदर है। और निश्चित रूप से मैं क्या उपयोग कर रहा हूं, इसकी एक भिन्नता है। लेकिन कम से कम मुझे इस तरह से पता है कि यह एक विकल्प के रूप में मौजूद नहीं है और मुझे अपना स्वयं का प्रदान करने की आवश्यकता है।
0xC0000022L

1
@ 0xC0000022L वैसे, कुछ वर्षों में, जब btrfs supplants ext4 होता है, तो आप स्क्रैप lnऔर उपयोग cp --reflink=auto(मेरे अपडेट किए गए उत्तर देखें) का उपयोग करना चाह सकते हैं ।
गिलेस एसओ- बुराई को रोकना '

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