GNU cp और mv में -T विकल्प का अतिरिक्त मूल्य क्या है?


26

कुछ GNU Coreutils कमांड का -T/--no-target-directoryविकल्प क्यों है? ऐसा लगता है कि यह सब कुछ है कि यह .एक पारंपरिक यूनिक्स निर्देशिका पदानुक्रम में (स्वयं डॉट) के शब्दार्थों का उपयोग करके प्राप्त किया जा सकता है ।

मानते हुए:

cp -rT /this/source dir

-Tविकल्प के लिए एक बनाने से रोकता है प्रतिलिपि dir/sourceउपनिर्देशिका। बल्कि इससे /this/sourceपहचाना जाता है dirऔर पेड़ों के बीच सामग्री की मैपिंग की जाती है। इसलिए उदाहरण के /this/source/foo.cलिए dir/foo.cऔर इतने पर जाता है , बजाय dir/source/foo.c

लेकिन इसका -Tउपयोग किए बिना विकल्प को आसानी से पूरा किया जा सकता है :

cp -r /this/source/. dir  # Probably worked fine since dawn of Unix?

शब्दार्थ, अनुगामी डॉट घटक को एक बच्चे के रूप में कॉपी किया जाता है dir, लेकिन निश्चित रूप से कि "बच्चा" पहले से ही मौजूद है (इसलिए इसका निर्माण नहीं होना चाहिए) और वास्तव में dirस्वयं है, इसलिए इस प्रभाव /this/pathकी पहचान की जाती है dir

यदि वर्तमान निर्देशिका लक्ष्य है तो यह ठीक काम करती है:

cp -r /this/tree/node/. . # node's children go to current dir

क्या ऐसा कुछ है जो आप केवल उसी के साथ -Tकर सकते हैं जो इसके अस्तित्व को तर्कसंगत बना सकता है? (ऑपरेटिंग सिस्टम के लिए समर्थन के अलावा जो डॉट डायरेक्टरी को लागू नहीं करते हैं, प्रलेखन में उल्लेखित तर्क नहीं है।)

क्या उपरोक्त डॉट ट्रिक उन्हीं रेस स्थितियों को हल नहीं करती है, जो GNU इंफो डॉक्यूमेंटेशन में उल्लिखित हैं -T?

जवाबों:


29

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

cp srcfile destfile

और पहले से ही एक निर्देशिका है जिसका नाम destfileयह कॉपी करेगा destfile/srcfile, जिसका इरादा नहीं हो सकता है। इसलिए आप उपयोग करें

cp -T srcfile destfile

और आप सही ढंग से त्रुटि प्राप्त करते हैं:

cp: cannot overwrite directory `destfile' with non-directory

यदि आपने .विधि का उपयोग करने की कोशिश की है, तो कॉपी कभी काम नहीं करेगी:

cp: cannot stat `srcfile/.`: Not a directory

.चाल करता है जब किसी फ़ाइल को कॉपी, बस एक ही समय में अपने basename नहीं का नाम बदलने जब काम! cp /path/to/file /target/dir/. यदि /target/dir/fileमौजूद है और एक निर्देशिका है, तो आप एक ही निदान प्राप्त करते हैं! लेकिन आपने दिखाया -Tहै कि एक कदम में इसके बिना क्या किया जा सकता है, बिना दौड़ की स्थिति के: एक फ़ाइल की प्रतिलिपि बनाएँ और उसका नाम बदले बिना इसे एक उपनिर्देशिका में हिलाया जा सकता है।
काज

3
यह वही नहीं है - जिस .चाल के बारे में आप बात कर रहे हैं /.वह स्रोत को जोड़ रहा है ।
बमर

21

के साथ समस्या cp/ mv/ lnके रूप में वे मूल रूप से डिजाइन किए गए थे कि वे दो आदेशों में से एक में (है नकल करने के लिए और में कॉपी )।

cp A B

या तो है बी करने के लिए एक कॉपी या बी में एक कॉपी ( बी / एक के लिए प्रति एक ) के आधार पर Bमौजूद है और (यदि बी एक निर्देशिका में एक सिमलिंक है और अधिक विविधताओं) एक निर्देशिका या नहीं है।

यह बुरा है क्योंकि यह अस्पष्ट है। इसलिए जीएनयू कार्यान्वयन ने इसके आसपास काम करने के लिए विकल्प जोड़े हैं।

cp -T A B

ए से बी की परवाह किए बिना। यदि Bमौजूद है और एक निर्देशिका है, तो वह विफल हो जाएगी (जब तक आप पास नहीं होते -r)। किसी भी स्थिति में, जब आप B को कॉपी करने का इरादा रखते हैं, तो आप किसी Aफ़ाइल के साथ अंत नहीं करेंगे ।BA

तथा:

cp -t B A

में कॉपी है


मूल यूनिक्स दर्शन आपको यह पता लगाने के लिए है कि आप क्या करते हैं, और खुशी से आपको अपने आप को पैर में गोली मारने की अनुमति देगा।
लीन

4
@ चलो, लेकिन यहाँ यह अपने आप को पैर में शूटिंग से बचने का एक तरीका नहीं देता है। यदि कोई बी निर्देशिका बनाता है या cp A Bकमांड चलाने से ठीक पहले कुछ निर्देशिका के लिए सहानुभूति रखता है, तो वह नहीं करेगा जो आप का इरादा था। और [ -e B ] || [ -L B ] || cp A Bअभी भी एक दौड़ की स्थिति है जो cp -Tn A Bनहीं है।
स्टीफन चेजालस

6

-Tएक विफलता प्रदान कर सकते हैं एक निर्देशिका गलत तरीके से क्या एक गंतव्य फ़ाइल होना चाहिए के लिए मौजूद है:

$ mkdir mustbeafile
$ touch afile
$ cp -T afile mustbeafile
cp: cannot overwrite directory `mustbeafile' with non-directory
$ echo $?
1
$ cp afile mustbeafile
$ 

यही कारण है कि, सफलता-पर-अनपेक्षित-कॉपी-टू-ए-सबडिर के बजाय, एक चेतावनी और अच्छी-अच्छी निकास स्थिति होती है, जो तब स्क्रिप्ट को निरस्त करने का कारण बन सकती है, और मानव निरीक्षण करता है कि एक निर्देशिका क्यों है जहां नहीं होनी चाहिए एक बने।


0

ध्वज का उपयोग करना बहुत अधिक स्पष्ट है, और अनपेक्षित प्रभावों का जोखिम कम होता है, जब कमांड को स्क्रिप्ट में मैन्युअल रूप से दर्ज करने के बजाय उपयोग किया जाता है। एक स्क्रिप्ट में रास्तों पर डॉटिंग पैच सभी प्रकार की अप्रत्याशित शरारत को समाप्त कर सकता है।

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