कमांड लाइन में फाइलों को कॉपी और पेस्ट करने के लिए क्लिपबोर्ड?


25

बैश में, मान लीजिए कि मैं एक निर्देशिका पर जाता हूं, और फिर दूसरी निर्देशिका। मैं पहली निर्देशिका से दूसरी निर्देशिका में एक फ़ाइल की प्रतिलिपि बनाना चाहूंगा, लेकिन उनमें से लंबे मार्गों को निर्दिष्ट किए बिना। क्या यह संभव है?

मेरा अस्थायी समाधान /tmpफ़ाइल की एक प्रति संग्रहीत करने के लिए एक अस्थायी स्थान के रूप में उपयोग करना है। cp myfile /tmpजब मैं पहली निर्देशिका में हूं, और तब cp /tmp/myfile .जब मैं दूसरी निर्देशिका में हूं। लेकिन मैं जाँच सकता हूँ कि क्या फ़ाइल में कुछ भी लिखना होगा /tmp

क्या फ़ाइल की प्रतिलिपि बनाने और चिपकाने के लिए क्लिपबोर्ड के समान कुछ है?


1
आपको cdकमांड टाइप करना है , ताकि आप कमांड cd -को वापस बुलाने के लिए पिछली डायरेक्टरी, अप-ऐरो पर वापस cdजा सकें और cpइसके बजाय लाइन एडिट कर सकें cd। (ctrl-a (start-of-line), alt-d (किल-वर्ड) cp -a,, ctrl-e (एंड-ऑफ-लाइन))।
पीटर कॉर्डेस

Emacs के साथ और M-x termआप Emacs के क्लिपबोर्ड का उपयोग कर सकते हैं।
पाएल जीडी

1
आप मिडनाइट कमांडर का उपयोग कर सकते हैं और हुप्स के माध्यम से कूदने के बारे में भूल सकते हैं।
हिरण हंटर

@ PålGD लोग कहते हैं कि Emacs 'एक ऑपरेटिंग सिस्टम है ... अधिकांश में क्लिपबोर्ड हैं;)
Volker Siegel

@JeffSchaller धन्यवाद ................................
टिम

जवाबों:


59

बैश का उपयोग करते हुए, मैं बस निर्देशिकाओं का दौरा करूंगा:

$ cd /path/to/source/directory
$ cd /path/to/destination/directory

फिर, मैं शॉर्टकट का उपयोग करूंगा ~-, जो पिछली निर्देशिका को इंगित करता है:

$ cp -v ~-/file1.txt .
$ cp -v ~-/file2.txt .
$ cp -v ~-/file3.txt .

यदि कोई निर्देशिका को उल्टे क्रम में देखना चाहता है, तो:

$ cp -v fileA.txt ~-
$ cp -v fileB.txt ~-
$ cp -v fileC.txt ~-

25
+1 अब मैं 20 से अधिक वर्षों के लिए यूनिक्स / लिनक्स गोले का उपयोग कर रहा हूं, और मुझे पता नहीं है कि शॉर्टकट।
डब्यू

4
हुह, के लिए एक आसान शॉर्टकट है "$OLDPWD"। तीन अलग-अलग cpआदेश क्यों , हालांकि? cp -a ~-/file[1-3].txt .
पीटर कॉर्डेस

4
दरअसल, तीनों cpउदाहरण हैं। वास्तविक दुनिया में, वाइल्डकार्ड वर्णों का उपयोग कॉपी कार्य को सरल बनाने के लिए भी किया जा सकता है।
एंडरसन मेडेरियोस गोम्स

2
मैं कुछ के बारे में pushdऔर पार्सिंग का उल्लेख करने जा रहा था dirs... लेकिन यह बहुत दूर है, बेहतर है। मेरा सुझाव है कि आप इस तथ्य को जोड़ते हैं जो "$OLDPWD"बिल्कुल समान है ~-और अधिक पोर्टेबल है (उपयोग नहीं करने वाले लोगों के लिए उपयोगी है bash।)
वाइल्डकार्ड

1
~+इसी तरह के लिए एक शॉर्टकट है"$PWD"
पॉल इवांस

11

यदि मैंने उस स्थिति को वन-ऑफ़ के रूप में आते देखा, तो मैं:

a=`pwd`
cd /somewhere/else
cp "$a/myfile" .

यदि ऐसी निर्देशिकाएं थीं जो मैंने खुद को अर्ध-नियमित रूप से फ़ाइलों की प्रतिलिपि बनाते हुए पाईं, तो मैं शायद उनके लिए कुछ mnemonic चरों को उनके .profile में परिभाषित करूंगा।

जोड़ने के लिए संपादित:

इस पर सोने के बाद, मैंने सोचा कि मैं अन्य जीयूआई / ओएस व्यवहारों को कितनी बारीकी से प्राप्त कर सकता हूं जहां आप कुछ संख्या में फ़ाइलों का चयन करते हैं, उन्हें "काट" या "कॉपी" करते हैं, फिर उन्हें कहीं और "पेस्ट" करते हैं। सबसे अच्छा चयन तंत्र जो मैं आपके मस्तिष्क / वरीयताओं के साथ आ सकता था, वह शेल की ग्लोबिंग सुविधा थी। मैं नामकरण के साथ बहुत रचनात्मक नहीं हूं, लेकिन यह मूल विचार है (बैश सिंटैक्स में):

function copyfiles {
  _copypastefiles=("$@")
  _copypastesrc="$PWD"
  _copypastemode=copy
}

function cutfiles {
  _copypastefiles=("$@")
  _copypastesrc="$PWD"
  _copypastemode=cut
}

function pastefiles {
  for f in "${_copypastefiles[@]}"
  do
    cp "${_copypastesrc}/$f" .
    if [[ ${_copypastemode} = "cut" ]]
    then
      rm "${_copypastesrc}/$f"
    fi
  done
}

इसका उपयोग करने के लिए, कोड को ~ / .bash_profile में, फिर cdस्रोत निर्देशिका में डालें और copyfiles glob*hereया तो चलाएं cutfiles glob*here। यह सब होता है कि आपका शेल ग्लब्स का विस्तार करता है और उन फ़ाइलनाम को एक सरणी में रखता है। फिर आप cdगंतव्य निर्देशिका और चलाने के लिए pastefiles, जो cpप्रत्येक स्रोत फ़ाइल के लिए एक कमांड निष्पादित करता है । यदि आपने पहले फ़ाइलों को "कट" किया था, तो पेस्टफाइल्स स्रोत फ़ाइल (या, कोशिश करता है) को भी हटा देता है। यह किसी भी त्रुटि की जाँच नहीं करता है (मौजूदा फ़ाइलों में, संभावित रूप से उन्हें क्लोब करने से पहले cp; या आपके पास "कट" के दौरान फ़ाइलों को हटाने की अनुमति है, या आप बाहर निकलने के बाद स्रोत निर्देशिका को फिर से एक्सेस कर सकते हैं। इसके)।


4
आपके वन-ऑफ़ के लिए, $OLDPWDपहले से ही मौजूद है, जिसे ~-बाश और zsh में छोटा किया जा सकता है ।
गिल्स एसओ- बुराई को रोकना '

5

मुझे लगता ~-है कि सही उत्तर है, लेकिन ध्यान दें कि बैश में एक अंतर्निहित लाइन संपादक है जो पाठ को कॉपी / पेस्ट कर सकता है।

यदि आप emacs मोड में हैं, तो आप अपने cdकमांड को इतिहास से याद कर सकते हैं , और लाइन को "रिंगबोर्ड" को किल-रिंग (कुछ अन्य तरीके भी हैं) Control-uको मारने के लिए उपयोग कर सकते हैं। फिर आप किसी भी समय इस स्ट्रिंग को नए कमांड में जोड़ सकते हैं Control-y। जाहिर है, आपके उदाहरण में यह निर्भर करता है कि आपने अपने cdआदेश में एक निरपेक्ष निर्देशिका नाम का उपयोग किया है ।

आप दिलचस्प डिफ़ॉल्ट की-बाइंडिंग का भी उपयोग कर सकते हैं Meta-.। यह पिछले शब्द से आपके वर्तमान लाइन में अंतिम शब्द को कॉपी करता है । यदि दोहराया जाता है, तो हर बार यह इतिहास में एक आदेश वापस जाता है। तो यदि आप एक करते हैं cd /x, तो आपके cd /yबाद आपके इनपुट में cdMeta-.Meta-.होगा /x


5

एंडरसन एम। गोम्स के जवाब पर विस्तार करते हुए , बैश आपको अपनी निर्देशिका स्टैक में किसी भी पूर्व निर्देशिका को टाइप करने ~N(या ~+N) में रखने की अनुमति देता है जहां Ndir स्टैक पर स्थिति है। उदाहरण के लिए:

# go some places
$ cd /path/to/source/directory
$ pushd /path/to/destination/directory
$ pushd $HOME
$ pushd /tmp

# show the current dir stack
$ dirs -v
0 /tmp
1 ~
2 /path/to/destination/directory
3 /path/to/source/directory

अब आप दो पिछली निर्देशिकाओं में से किसी एक फ़ाइल को कॉपी कर सकते हैं, न ही उनमें से कोई एक वर्तमान के साथ:

cp -v ~3/file1.txt ~2

मूल पोस्टर की समस्या को हल करने के लिए, आप निम्न कार्य करेंगे:

$ cd /path/to/source/directory
$ pushd /path/to/destination/directory

# show the current dir stack
$ dirs -v
0 /path/to/destination/directory
1 /path/to/source/directory

# copy
cp -v ~1/file[123].txt .

फ़ाइलों के एक बड़े सेट के साथ, आप एक प्रकट फ़ाइल में उनके नाम सूचीबद्ध कर सकते हैं और फिर स्रोत dir से कॉपी कर सकते हैं:

$ cd /path/to/destination/directory
$ pushd /path/to/source/directory

# copy
cp -v $(cat files_to_copy.list) ~1

इसे भी देखें: बैश मैन पेज का यह खंड


इसी तरह, Tcsh में, आप अपने dir स्टैक पर दूसरी डीआईआर को संदर्भित करने के लिए =2नोटेशन (बजाय ~2) का उपयोग कर सकते हैं ।

इसे भी देखें: टीसीएस मैन पेज का यह भाग


4

जब आप पहली निर्देशिका में होते हैं, तो स्रोत या srcसंक्षेप में कहें, निष्पादित करें

src=${PWD}

फिर cdदूसरी निर्देशिका में और निष्पादित करें:

cp -i ${src}/filename .

-iविकल्प है यदि आप अधिलेखित करना चाहते पूछना होगा, अगर वहाँ एक डुप्लिकेट फ़ाइल है


धन्यवाद। यह फ़ाइल नाम निर्दिष्ट किए बिना और भी बेहतर है।
टिम

4

एंडरसन-एम-गोम्स प्रतिक्रिया पर एक भिन्नता। बैश का उपयोग करते हुए, मैं बस निर्देशिकाओं का दौरा करूंगा:

$ cd /path/to/source/directory
$ cd /path/to/destination/directory

फिर, मैं चर $ OLDPWD का उपयोग करूंगा, जो पिछली निर्देशिका को इंगित करता है:

$ cp -v $OLDPWD/file1.txt .

यदि कोई निर्देशिका को उल्टे क्रम में देखना चाहता है, तो:

$ cp -v fileA.txt $OLDPWD/

3
+1, लेकिन आप अपने चर विस्तार को "उद्धरण" देना भूल गए। यदि $OLDPWDरिक्त स्थान हैं, तो यह टूट जाता है। इसके अलावा, मैं हमेशा उपयोग करता हूं cp -a। इसके अलावा, यह दुर्भाग्यपूर्ण है कि टैब-पूर्णता चर विस्तार पर टूट गई है। आप मौजूदा कमांड लाइन का विस्तार करने के लिए ctrl-alt-e का उपयोग कर सकते हैं, हालांकि, $ OLDPWD भाग टाइप करने के बाद।
पीटर कॉर्डेस

1
~-के लिए एक शॉर्टकट है$OLDPWD
गाइल्स 'एसओ-बुराई को रोकें'

मैं सिर्फ एक और भिन्नता की ओर इशारा कर रहा था, क्योंकि यूनिक्स / लिनक्स उनमें से भरा हुआ है। मजेदार, कि मैं लिनक्स का उपयोग २० वर्षों से कर रहा हूं, और मैंने पहले कभी नहीं देखा। इसके अलावा, $ OLDPWD को याद रखना आसान है।
स्कॉट कार्लसन

3

यदि बैश में, मैं पुशड और पॉपड का उपयोग करूंगा । ये आदेश बाद में उपयोग के लिए निर्देशिकाओं का एक आसान फीफो स्टैक रखते हैं। आप डायरियों का उपयोग करके कभी भी स्टैक से परामर्श कर सकते हैं ।

जैसे मैं करूँगा:

pushd .
cd /somewhere/else
cp "`popd`/myfile"

2

आप उपयोग कर सकते हैं xclip:

NAME
       xclip - command line interface to X selections (clipboard)

SYNOPSIS
       xclip [OPTION] [FILE]...

DESCRIPTION
       Reads  from standard in, or from one or more files, and makes the data available as an X selection for pasting
       into X applications. Prints current X selection to standard out.

उदाहरण:

$ cd /path/to/dir1
$ xclip-copyfile file1 file2
$ cd /path/to/dir2
$ xclip-pastefile
file1 file2

इसके अलावा एक्ससेल पर जाएं


यह tar | gzipएक्स क्लिपबोर्ड के अंदर / बाहर करता है । Kinda clunky की तुलना में cp, और सहानुभूति या हार्डलिंक बनाने के लिए सामान्यीकृत नहीं करता है। ( cp -asया cp -al)
पीटर कॉर्ड्स

1

आप clipboard-filesयहाँ स्क्रिप्ट देख सकते हैं: https://github.com/larspontoppidan/clipboard-files

यह जैसे आदेश प्रदान करता है ccopy, ccutऔर cpasteजो डेस्कटॉप वातावरण क्लिपबोर्ड का उपयोग करता है और फ़ाइलों की सहज प्रतिलिपि / चिपकाने की अनुमति देता है:

ccopy myfile
cd <second directory>
cpaste

जैसा कि डेस्कटॉप वातावरण क्लिपबोर्ड का उपयोग किया जाता है, कॉपी / पेस्टिंग अन्य प्रोग्राम जैसे फाइल मैनेजर और आईडीजी के क्लिपबोर्ड पर रखी गई फाइलों के साथ इंटरैक्ट करेगा। कम से कम यह गनोम की तरह डेस्कटॉप पर काम करता है।

पूर्ण प्रकटीकरण, मैंने स्क्रिप्ट लिखने के बाद कुछ ऐसा खोज निकाला जैसे कि वह वहां से बाहर हो ...

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