एक फ़ाइल ले जाएँ और एक नरम लिंक को पीछे छोड़ दें


10

मैं एक एकल लिनक्स कमांड की तलाश में हूं जो मुझे इसके बराबर करने की अनुमति देता है:

cp /some/path/file /another/path/ && ln -sf /another/path/file /some/path/

यदि कोई नहीं है, तो फाइलों के एक समूह के लिए ऐसा करने का सबसे अच्छा तरीका क्या है?


मैं इसे लिखने के लिए अच्छी तरह से बैश स्क्रिप्टिंग नहीं जानता, लेकिन मेरा समाधान सिर्फ एक स्क्रिप्ट लिखना और इसे cpln की तरह कुछ आकर्षक कहना होगा
Unkwntech

1
सीपीपी एमवी नहीं होना चाहिए?
बार्ट वैन ह्युकेलोम

नहीं। -F विकल्प ln का ध्यान रखता है।
इन्ना

1
एक 10GB फाइल पर यह कोशिश
hayalci

2
@HelloGoodbye आप के &&साथ भ्रमित कर रहे हैं &। जैसा कि लिखा गया है, लाइन cp के रिटर्न वैल्यू की जांच करती है और सफल होने पर ही दूसरा भाग चलाती है।
इसकायादोक

जवाबों:


7

एक छोटा नोट, यह है कि आप दोनों का उपयोग कर सकते हैं कमांड को वास्तव में डेटा को स्थानांतरित नहीं करने के लिए (दोनों पथ एक ही फाइल सिस्टम पर हैं)।

ln /some/path/file /another/path/ && ln -sf /another/path/file /some/path/

लेकिन मुझे लगता है कि आप / कुछ / पथ / की सामग्री को एक अन्य डिस्क पर ले जाना चाहते हैं, और फिर नई फ़ाइलों के लिंक बनाएं ताकि "कोई भी" नोटिस न हो।

for f in `ls /some/path/`; do ln /some/path/$f /another/path/ && ln -sf /another/path/$f /some/path; done

इसे बैश फ़ंक्शन में लपेटना:

function cpln {
    for f in `ls $1`
    do
        ln $1/$f $2 && ln -sf $2/$f $1
    done
}

क्या इस काम को करने का कोई तरीका है अगर मैं जो आगे बढ़ रहा हूं वह एक निर्देशिका होना चाहिए?
tladuke

यह डिस्क पर वास्तविक फ़ाइल को कैसे स्थानांतरित करता है?
इब्राहिम

इब्राहिम: डेटा स्थानांतरित नहीं होता है, यह सिर्फ निर्देशिका में संकेत को अद्यतन करता है।
श्री शार्क

tladuke: हाँ और नहीं। चूंकि डिस्क पर डायरेक्टरी ज्यादा स्मैलर है, इसलिए ln ट्रिक (जो डायरेक्टरी के लिए काम नहीं करता है) की कोई जरूरत नहीं है, बस एक mv :-)
Mr Shark

2

मेरी स्क्रिप्ट का आप उपयोग कर सकते हैं (दो पैरामीटर / कुछ / पथ / फ़ाइल और / अन्य / पथ /) लेता है)

#!/bin/bash
cp $1 $2
if [ "$?" -ne "0" ]; then
    echo "Some error"
    exit 1
    fi
ln -sf $2/${1##*/} ${1%/*}

स्ट्रिंग जोड़तोड़ के साथ कूल चाल, पहले कभी नहीं देखा था। धन्यवाद!
इद्दतोक

1

सच में, मुझे लगा कि यह वास्तव में आसान सवाल था।

यहाँ मैं पर्ल में क्या कर सकता हूँ:

#!/bin/perl
# Usage: cpln TARGETDIR SOURCE...
# Example: find tree/ -type f | xargs cpln commands/

$target = shift;

foreach(@ARGV) {
    m[(.*)/([^/]+)];
    system("cp $_ $target");
    system("ln -sf $target/$2 $1/");
}

मैं कुछ और सुरुचिपूर्ण की उम्मीद कर रहा था, लेकिन मुझे लगता है कि मैं इसका उपयोग करूंगा।


1
इसे "पर्ल" में करने के लिए, आपको फ़ाइल :: कॉपी (या समान) और सिमलिंक () का उपयोग करना चाहिए। पर्ल खोल नहीं है; सिस्टम से बचें (), और विशेष रूप से पूरे कमांड लाइन को सिस्टम से गुजरने से बचें () (जैसे, क्या होगा अगर किसी तर्क में कोई स्थान होता है?)। किसी भी तरह से, हमेशा, हमेशा, वापसी मूल्यों की जाँच करें।
जॉन सिराकुसा
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.