Mv -f का क्या मतलब है?


34

GNU coreutils के लिए मैनुअलmv का कहना है:

-f --force Do not prompt the user before removing a destination file.

हालाँकि, यह पहले से ही डिफ़ॉल्ट व्यवहार के लिए प्रतीत होता है mv, इसलिए यह -fविकल्प अतिश्योक्तिपूर्ण प्रतीत होता है। जैसे ग्नू बैश संस्करण में 4.3.11:

$ ls -l
total 0
$ touch 1 2; mv -f 1 2; ls
2
$ touch 1 2; mv 1 2; ls
2

ऐसा लगता है कि -fध्वज का इरादा ओवरराइड करने की संभावना नहीं है alias mv="mv -i", क्योंकि एक उपनाम (जैसे का उपयोग करने) के कई मानक तरीके हैं\mv ) जो इसे अधिक संक्षिप्त रूप से और एक तरह से आदेशों के अनुरूप है।

मैनुअल नोट करता है कि, "यदि आप -i -f, -n विकल्पों में से एक से अधिक निर्दिष्ट करते हैं, तो केवल अंतिम एक ही प्रभावी होता है," लेकिन यह अभी भी लगता है कि -fध्वज का इरादा -iसामान्य रूप से ध्वज को ओवरराइड करने का नहीं है । क्योंकि समतुल्य व्यवहार का उपयोग करके प्राप्त किया जा सकता है mv, जो कि उपयोग करने की तुलना में अधिक संक्षिप्त और समझने योग्य हैmv -if

यही कारण है कि -fझंडे का उद्देश्य क्या है ? इसका अस्तित्व क्यों है?


6
चूक एक नकचढ़ा व्यवसाय है। mountउदाहरण के लिए, जैसे एक उपकरण लें (हालांकि बेहतर उदाहरण हैं)। क्या आप वास्तव में यह याद रखना चाहते हैं कि हर विकल्प के लिए चूक क्या है, इसलिए आप यह निर्धारित कर सकते हैं कि आपको कौन से विकल्प सेट करने की आवश्यकता है? यह डिफ़ॉल्ट और गैर-डिफ़ॉल्ट दोनों के लिए विकल्प है, इसलिए आप मानसिक रूप से डिफ़ॉल्ट क्या है, इसका ध्यान रखने की आवश्यकता के बजाय विकल्प को स्पष्ट रूप से सेट कर सकते हैं। वहाँ कुछ याद रखना आसान है , वहाँ कुछ नहीं है
वाइल्डकार्ड

यदि एमवी को mv-i से
बदल दिया

1
IMO, स्क्रिप्ट में उपयोग के लिए भी अच्छा है, क्योंकि आप स्पष्ट हैं। यह इरादे को थोड़ा बेहतर बनाता है।
ब्लैकलाइट शाइनिंग

जवाबों:


41

4BSD से मैन पेज-f में इसका उपयोग अधिक स्पष्ट रूप से वर्णित किया गया है , जो कि जहां और विकल्प जोड़े गए थे:-f-i

यदि फ़ाइल 2 पहले से मौजूद है, तो फ़ाइल 1 को स्थानांतरित करने से पहले इसे हटा दिया जाता है । यदि फ़ाइल 2 में एक मोड है जो लेखन को मना करता है, तो एमवी मोड प्रिंट करता है और एक लाइन प्राप्त करने के लिए मानक इनपुट पढ़ता है; यदि रेखा y से शुरू होती है, तो चाल चलती है; यदि नहीं, तो mv बाहर निकलता है।

विकल्प:

-iइंटरैक्टिव मोड के लिए खड़ा है। जब भी किसी कदम को किसी मौजूदा फ़ाइल को सुपरसीड करना होता है, तो उपयोगकर्ता को एक प्रश्न चिह्न के बाद फाइल के नाम से संकेत दिया जाता है। यदि वह 'y' से शुरू होने वाली रेखा के साथ उत्तर देता है, तो चाल जारी रहती है। कोई भी अन्य उत्तर इस कदम को होने से रोकता है।

-fबल के लिए खड़ा है। यह विकल्प किसी भी मोड प्रतिबंध या -iस्विच को ओवरराइड करता है ।

पॉसिक्स मानक में एमवी कैसे संचालित होता है , इसकी एक और अधिक सटीक परिभाषा है , जो जोड़ता है कि -fकेवल तभी ओवरराइड करता है -iयदि यह बाद में कमांड लाइन में होता है।

इसलिए डिफ़ॉल्ट व्यवहार थोड़ा अलग है -f। डिफ़ॉल्ट केवल पुष्टि के लिए पूछने के लिए है जब लक्ष्य लेखन योग्य नहीं है। (यह व्यवहार कम से कम V4 तक जाता है , जहां mvकोई विकल्प नहीं था।) यदि -iविकल्प दिया गया है, तो mv अतिरिक्त रूप से पुष्टि के लिए पूछेगा जब भी लक्ष्य मौजूद हो। -fविकल्प उन मामलों के दोनों में पूछ (अगर यह किसी भी के बाद होता है से रोक सकता है -i)।


शानदार जवाब, धन्यवाद! NB कुछ फ़ाइल सिस्टम (जैसे CIFS) mv के कारण अप्रत्याशित व्यवहार (यानी मैनुअल से भिन्न) प्रदर्शित कर सकता है, जैसे कि अभिनय भले ही -fध्वज का उपयोग न किया गया हो
सम्पाब्लोकपर

यह ध्यान देने योग्य है कि कई कार्यान्वयन केवल पुष्टि के लिए पूछते हैं यदि वे एक इंटरैक्टिव टर्मिनल ( isatty(0)) में दिखाई देते हैं । इसके अलावा, जबकि यह सच है कि बाद में -fओवरराइड -iहो जाता है, इसका मतलब यह नहीं हो सकता है कि यह वही है जो कोई तर्क नहीं दिया गया है।
phk

15

यह उपयोगी है जब mvएक डिफ़ॉल्ट डिफ़ॉल्ट का निष्पादन निर्धारित किया है :

alias mv="mv -i"

जब आप एक चाल को मजबूर करना चाहते हैं, तो यह काम करेगा:

mv -f

चूंकि यह विस्तारित कमांड में अंतिम विकल्प है जो मायने रखता है:

mv -i -f

इस बिंदु का उल्लेख जीएनयू कोरुटिल्स मैनुअल में भी किया गया है ।


1
धन्यवाद, लेकिन उन कारणों के लिए जो मैंने अब सवाल में जोड़ दिए हैं, यह संभावना नहीं लगती कि ओवरराइडिंग alias mv="mv -i"के अस्तित्व का कारण है -f
sampablokuper

12
मैं डिफ़ॉल्ट कॉल करने पर आपत्ति करता हूं "जैसा कि आप से पूछा जाता है, कोई गूंगा सवाल नहीं करता है" mv(1)(और अन्य यूनिक्स आदेशों) का व्यवहार "पागल" जैसा कि आप करते हैं ...
vonbrand

1
वॉनब्रांड, जबकि मैं बिना लिनक्स / यूनिक्स कमांड के सीधे प्रतिक्रिया की सराहना करता -iहूं, मेरा मानना ​​है कि जिसने भी कुछ वर्षों से अधिक समय तक कमांड लाइन का उपयोग किया है mv, वह एक बिंदु या किसी अन्य द्वारा जला दिया गया है ।
अलेक्जेंडर

1
आप सोच सकते हैं कि ओवरराइडिंग -आई की संभावना नहीं है, लेकिन यही कारण है कि मुझे लगता है कि -f का उपयोग इस तरह किया जाता है।
वाल्टर

11

यह मौजूद है क्योंकि ( man mv)

आप एक से अधिक निर्दिष्ट करते हैं -i, -f, -n, केवल अंतिम एक प्रभावी होता है।

तो, आपके पास एक स्क्रिप्ट / उपनाम / फ़ंक्शन हो सकता है जो हमेशा पूछता है, लेकिन आप अभी भी विकल्प को ओवरराइड कर सकते हैं।

# alias
alias mv='mv -i'

# function
MV () { mv -i "$@" ; }

# script
#!/bin/bash
mv -i "$@"

एक सार्थक फ़ंक्शन / स्क्रिप्ट कुछ और करेगा, निश्चित रूप से (जैसे कार्रवाई लॉग करें)।


@choroba धन्यवाद, लेकिन उन कारणों के लिए, जिन्हें मैंने अब सवाल में जोड़ दिया है, यह संभावना नहीं लगती है कि एलियाज़ को ओवरराइड करना जैसे alias mv="mv -i"अस्तित्व के लिए कारण है -f। आप स्क्रिप्ट और कार्यों का उल्लेख करते हैं, हालांकि। क्या आप इन दोनों का उपयोग करके उदाहरण दे सकते हैं?
सम्पालाकुपर

@sampablokuper: अपडेट किया गया।
कोरोबा

@choroba, फिर से धन्यवाद। अफसोस की बात है कि न तो आपका फ़ंक्शन उदाहरण और न ही आपकी स्क्रिप्ट उदाहरण का उपयोग करता है mv -f, इसलिए यह अभी भी मेरे लिए अस्पष्ट है कि वे इसके अस्तित्व को कैसे उचित / स्पष्ट करते हैं। क्षमा करें यदि मैं स्पष्ट याद कर रहा हूँ!
सम्पाबलोक्पर

@sampablokuper: वे सभी का उपयोग करें mv -i। यदि आप उनका उपयोग करना चाहते हैं, लेकिन बातचीत को छोड़ दें, तो आप उपयोग करेंगे MV -fआदि
कोरोब

1
@sampablokuper mvउन विकल्पों में से किसी के बिना व्यवहार कभी-कभी पूछने के लिए है (लक्ष्य नहीं लेखन योग्य और इंटरैक्टिव टर्मिनल), इसलिए यह mv -fऔर के बीच एक स्पष्ट अंतर होगा \mv
phk

5

mvसाथ अलग ढंग से अपने आप ही कर सकते हैं समारोह पर आदेश -fविकल्प, कि यह एक संकेत किए बिना अधिलेखित लिखने सुरक्षित फ़ाइलों की कोशिश करेंगे।

user2@host:location> ls -l ./
drwxrwxr-x 2 user1 users    10   Oct 16 12:58 dir
user2@host:location> ls -l ./dir/
-rw-r--r-- 2 user1 users     0   Oct 16 12:58 file1
-rw-r--r-- 2 user2 users     0   Oct 16 12:58 file2
user2@host:location> \mv ./dir/file2 ./dir/file1
'mv' try to overwrite './dir/file1', overridding mode 0644 (rw-r--r--)? n
user2@host:location> \mv -f ./dir/file2 ./dir/file1
user2@host:location> ls -l ./dir/
-rw-r--r-- 2 user2 users     0   Oct 16 12:58 file1

निर्देशिका में लिखने की अनुमति के कारण user2 उपयोगकर्ता 1 फ़ाइलों को ओवरराइट कर सकता है ./dir/, लेकिन ऐसा करने से पहले चेतावनी दी जाएगी। -fचेतावनी को रोकता है।


-1

शेल प्रोग्रामिंग में, -f एक सामान्य मुहावरा है जिसका उपयोग यह सुनिश्चित करने के लिए किया जाता है कि आपके आदेश त्रुटियों के साथ निरस्त न हों या कुछ आदेशों को चलाने के दौरान इंटरैक्टिव प्रतिक्रिया के लिए स्क्रिप्ट / उपयोगकर्ता से पूछें। आखिरी चीज जो आप चाहते हैं वह आपकी स्क्रिप्ट के लिए उपयोगकर्ता इनपुट के लिए प्रतीक्षा करने के लिए है, या शायद बदतर है, इनपुट को मानक से इनपुट लेने के लिए गलत आदेश के लिए।

नोट: एक उपनाम को पूर्ववत करने से दुष्प्रभाव हो सकते हैं / दूर हो सकते हैं। यदि आपने किसी अन्य संस्करण के लिए या अतिरिक्त विकल्पों के साथ कमांड को अलियास किया है, तो उपनाम को अवांछित साइड इफेक्ट का कारण होगा। उदाहरण के लिए, आपके पास रीसायकल कैन (या अन्य सुरक्षा / ट्रैकिंग सिस्टम) का उपयोग करने के लिए एमवी और आरएम के साथ उर्फ ​​सेटअप हो सकता है। उर्फ को तोड़ने से यह टूट जाएगा ...


नाइटपिक: -fcp या mv का विकल्प यह गारंटी नहीं देता है कि "वे काम करते हैं"। उदाहरण के लिए यदि अनुमति अपर्याप्त है, तो -f कमांड इसे काम नहीं करेगा। आपके कहने का मतलब यह है कि -फिर बिना संकेत के ओवरराइट कर देता है। उल्टे झंडे का मतलब है कि ओवरराइट पर इंटरएक्टिव की जरूरत है।
एरिक लेसचिंस्की

दो बातें ध्यान दें: 1.) कार्यान्वयन सामान्य रूप से इस बात के लिए परीक्षण करेंगे कि क्या आप एक इंटरैक्टिव टर्मिनल ( isatty(0)) में भी हैं, इसलिए यदि आपकी स्क्रिप्ट पाइप के हिस्से के रूप में चलती है तो यह ट्रिगर नहीं होगा। 2.) जोड़ना -fपूर्ववत् के समान नहीं है -iक्योंकि mv -i -fइससे भिन्न है mv, मार्क का उत्तर देखें
phk
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.