मैं फ़ोल्डर पथ को दोहराए बिना किसी अन्य फ़ोल्डर में कमांड कैसे कर सकता हूं?


73

क्या किसी फ़ाइल को डुप्लिकेट करने के लिए ऑपरेशन या कमांड को कॉपी करने और स्थानांतरित करने का एक चतुर तरीका है, बिना एक ही फ़ोल्डर में cd, उसके mvबाद?

उदाहरण के लिए, मुझे निम्नलिखित को चलाना है:

mv /folder1/folder2/folder3/file.txt /folder1/folder2/folder3/file-2013.txt

ध्यान दें कि जहाँ मैं फ़ाइल ले जा रहा हूँ, निर्देशिका वही है, लेकिन मुझे पूरा रास्ता फिर से डालना होगा और कभी-कभी यह कष्टप्रद हो जाता है। मैं यह जानने के लिए उत्सुक हूं कि क्या ऐसा कोई दूसरा तरीका है , जिससे पूरे रास्ते को फिर से रखा जा सके , क्योंकि ऑपरेशन उसी रास्ते में किया जाएगा।


9
मुझे विश्वास नहीं हो रहा है कि इसमें बहुत सारे बदलाव हैं। यह एक डुप्लिकेट है unix.stackexchange.com/questions/35782/… और unix.stackexchange.com/questions/66889/…
user13107

13
@ user13107 प्रश्न पूछने के कई तरीके हैं, जिनमें अलग-अलग शब्द हैं। और यदि आप नहीं जानते कि उत्तर को "ब्रेस विस्तार" कहा जाता है, तो आप इसे तुरंत नहीं पा सकते हैं।
'16

2
@ user13107 वे एक अलग साइट पर हैं इसलिए डुप्लिकेट नहीं हैं
user151019

1
मार्क, धन्यवाद, मैं डुप्लिकेट के बारे में उस नियम को नहीं जानता था। @ एसएलएचके हां। मै समझता हुँ। मैं बस निराश था क्योंकि Unix.SE पर मेरा प्रश्न डुप्लिकेट के रूप में बंद हो गया और यह बहुत लोकप्रिय हो गया।
user13107

3
@ user13107, यह वही है जो आपको सही साइट पर पोस्ट करने के लिए मिलता है
सैमुअल एडविन वार्ड

जवाबों:


125

बस ब्रेस विस्तार का उपयोग करें :

mv /folder1/folder2/folder3/{file.txt,file-2013.txt}

यह लिखने के बराबर है:

mv /folder1/folder2/folder3/file.txt /folder1/folder2/folder3/file-2013.txt

ब्रेस विस्तार से आप निश्चित रूप से अधिक तर्कों की आपूर्ति कर सकते हैं। आप इसे श्रेणी भी पास कर सकते हैं, उदाहरण के लिए, परीक्षण फ़ोल्डर के एक जोड़े को बनाने के लिए, आप चला सकते हैं mkdir test_{a..z}, और बैश 4 के साथ शुरू करके, आप शून्य-गद्देदार अनुक्रम भी बना सकते हैं, साथ ही touch foo{0001..3}, जो बनाता है foo0001, foo0002और foo0003बैश हैकर्स विकी आप के लिए उदाहरण के एक जोड़े के साथ एक लेख है।

यदि आपको दो अलग-अलग कमांडों का उपयोग करना है cd, तो पहले एक उपखंड का उपयोग करें और जैसा कि @ इग्नासियो के उत्तर में है


5
मैं braceविस्तार के बारे में नहीं जानता था , धन्यवाद!
वाल्टर सिल्वा

मैंने कोशिश की और यह काम नहीं करने के लिए लगता है:meniac ~: mv /tmp/f1/f2/f3/f4/f5/f6/{file.txt, file2.txt} mv: cannot stat ``/tmp/f1/f2/f3/f4/f5/f6/{file.txt,': No such file or directory
वाल्टर सिल्वा

5
क्या आप सुनिश्चित हैं कि आप बैश का उपयोग कर रहे हैं, जैसा कि आप कर रहे हैं /bin/bash, और आप एक ऐसी स्क्रिप्ट में नहीं हैं /bin/shजो शेबंग या किसी अन्य शेल में है जो ग्रेस विस्तार का समर्थन नहीं करता है? यदि आप दौड़ते हैं set, तो क्या आपके पास SHELLOPTSहै braceexpand?
slhck

22
ध्यान दें कि file.txt,और के बीच कोई स्थान नहीं होना चाहिए file2.txt
slhck

9
आप इसे और भी छोटा बना सकते हैं, ताकि उस हिस्से में टाइपो को न रोका जा सके:mv /folder1/folder2/folder3/file{,-2013}.txt
Jan Fabry

74

ऑपरेशन को सबशेल में चलाएं।

( cd /folder1/folder2/folder3 && mv file.txt file-2013.txt )

वर्किंग डायरेक्टरी के परिवर्तन को मूल शेल में प्रचारित नहीं किया जाएगा।


11
+1: मुझे वह पसंद है, ब्रेस-एक्सपोज़र ट्रिक की तुलना में गोले के पार अधिक पोर्टेबल (जो कि साफ है, लेकिन कम पोर्टेबल है)
ओलिवियर दुलैक

@ ओलिवर, आपको क्या लगता है कि ब्रेस विस्तार पोर्टेबल नहीं है? आपके मन में कौन सा खोल है जो इसका समर्थन नहीं करता है?
एलेक्सिस

5
@alexis ब्रेस विस्तार POSIX द्वारा निर्दिष्ट नहीं है इसलिए गैर पोर्टेबल "डिजाइन द्वारा" है। ash, dash, ksh88नहीं पुराने बॉर्न शैल इसका समर्थन नहीं गोले के उदाहरण हैं उल्लेख करने के लिए।
जलीगेरे

@jlliagre आपने जिन गोले का उल्लेख किया है, वे पूरी तरह से POSIX अनुरूप हैं? इसका मतलब है कि उनके पास POSIX होने पर भी ब्रेस का विस्तार नहीं होगा। POSIX की पुष्टि होने से पहले ksh88 था; आपको कम से कम ksh93 में अपग्रेड करना चाहिए। लिनक्स में केवल दो लोग ही इस बात की परवाह करेंगे कि वे कुछ छोटे एम्बेडेड डिस्ट्रोस (बिजीबॉक्स, आईसर्क?) और बचाव डिस्क में उपयोग किए जाने वाले राख और डैश हैं।
काज

2
@ काज़ मुझे शेल कमांड की पोर्टेबिलिटी की परवाह है और यह तथ्य कि वे इंटरैक्टिव हैं या कोई फर्क नहीं पड़ता। बेशक, आप निश्चित रूप से इस बारे में परवाह नहीं करने के लिए स्वतंत्र हैं लेकिन कृपया स्वीकार करें कि लोग अन्यथा सोचते हैं। तथ्य यह है कि आप हमेशा बैश या एक शेल का उपयोग करते हैं जो बैर-विस्तार का समर्थन करता है इसका मतलब यह नहीं है कि हर किसी का मामला है।
जलीगेरे

21

यदि आप चतुर चाहते हैं, तो यहां इतिहास का विस्तार है

mv /folder1/folder2/folder3/file.txt !#:1:h/file-2013.txt

मैं इसका इस्तेमाल खुद नहीं करूंगा क्योंकि मुझे यह याद रखना असंभव है। मैं कभी- कभार विम समतुल्य का उपयोग करता हूं , लेकिन इसे लगभग हर बार देखना पड़ता है।


11

आप एक चर सेट कर सकते हैं। बेशक इसके आसपास चर छोड़ने का साइड-इफेक्ट है।

D=/folder1/folder2/folder3; mv $D/file.txt $D/file-2013.txt

और, ज़ाहिर है, आप संपूर्ण कमांड लाइन को एक उपधारा में डालकर चर (ओं) को छोड़ने के दुष्प्रभाव से बच सकते हैं: (D="/folder1/folder2/folder3"; mv "$D"/file.txt "$D"/file-2013.txt)या unsetअंत में एक कमांड जोड़कर । (मैंने उद्धरण को एक "सर्वोत्तम अभ्यास" के रूप में जोड़ा है; यदि आपको हमेशा उद्धरणों का उपयोग करने की आदत है, तो आपको अपने सिर को रोकना और खरोंचना नहीं होगा जब एक पाथनाम जिसमें विशेष वर्ण शामिल हैं, साथ आता है।)
स्कॉट

@ यदि आप साइड-इफ़ेक्ट को खत्म करने के लिए एक उपखंड का उपयोग करने जा रहे हैं, तो यह cdएक चर सेट करने की तुलना में आसान है । बहुत आसान नहीं है, मैं मानता हूं।
आइजैक राबिनोविच

2

मैं अन्य समाधानों को पसंद करता हूं, लेकिन यहां एक और है, जो स्क्रिप्ट के रूप में कार्यान्वित होता है, बैश सरणियों, पुशड, पॉपड के साथ:

#!/bin/bash
set -e
# from http://stackoverflow.com/a/246128/178651
script_path="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"

# paths relative to the script
relative_paths=( \
path1 \
path2 \
path3 \
path4
)

for relative_path in "${relative_paths[@]}"
do
  pushd "$script_path/$relative_path" > /dev/null 2>&1
  pwd
  mv filename1 filename2
  # could do other stuff in this directory...
  popd > /dev/null 2>&1
done

pushd "$script_path" > /dev/null 2>&1
# could do other stuff in same directory as script...
popd > /dev/null 2>&1

1

स्लॉक सीधे सरल तरीके से प्रश्न का उत्तर देता है, लेकिन वाल्टर भी ऑटोपॉप उत्तर पसंद करता है, इसलिए यहां एक ही लाइनों के साथ है;

pushd /folder1/folder2/folder3/; mv file.txt file-2013.txt; popd
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.