Dosyaları komut satırına kopyalamak ve yapıştırmak için pano?


25

Bash’de bir dizini ve ardından başka bir dizini ziyaret ettiğimi varsayalım. Bir dosyayı ilk dizinden ikinci dizine kopyalamak istiyorum, ancak bunların uzun yollarını belirtmeden. Mümkün mü?

Geçici çözümüm, /tmpdosyanın bir kopyasını depolamak için geçici bir yer olarak kullanmak . cp myfile /tmpilk dizinde cp /tmp/myfile .olduğumda ve sonra ikinci dizinde olduğumda. Ancak dosyanın içinde herhangi bir şeyin üzerine yazıp yazmayacağını kontrol edebilirim /tmp.

Bir dosyayı kopyalamak ve yapıştırmak için panoya benzer bir şey var mı?


1
cdKomutu yazmanız gerekir , böylece yalnızca cd -önceki dizine geri gidebilir, cdkomutu geri çağırmak için yukarı ok ve cpyerine olmak üzere satırı düzenleyebilirsiniz cd. (ctrl-a (satır başlangıcı), alt-d (kill kelimesi) cp -a, ctrl-e (satır sonu)).
Peter Cordes

Emacs ve M-x termEmacs 'panoya kullanabilirsiniz.
Pål GD

1
Midnight Commander'ı kullanabilir ve çemberlerin içinden atlamayı unutabilirsiniz.
Deer Hunter

@ PålGD İnsanlar Emacs'in 'bir işletim sistemi olduğunu söylüyorlar ... çoğunun panoları var;)
Volker Siegel

@JeffSchaller teşekkürler ................................
Tim

Yanıtlar:


59

Bash'i kullanarak sadece dizinleri ziyaret ederdim:

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

Ardından, ~-önceki dizine işaret eden kısayolu kullanırdım :

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

Bir kişi dizinleri ters sırada ziyaret etmek isterse, o zaman:

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

25
+1 20 yıldan fazla bir süredir Unix / Linux mermileri kullanıyorum ve bu kısayolu bilmiyordum.
Dubu

4
Huh, bu kullanışlı bir kestirme "$OLDPWD". cpYine de neden üç ayrı komut var? cp -a ~-/file[1-3].txt .
Peter Cordes

4
Aslında, üç cpörnek. Gerçek dünyada, kopya görevini basitleştirmek için joker karakterler de kullanılabilir.
Anderson Medeiros Gomes

2
pushdAyrıştırmak ve ayrıştırmaktan bahsedecektim dirs... ama bu çok daha iyi. Size "$OLDPWD"tam olarak eşdeğer olan ~-ve daha taşınabilir olan gerçeği eklemenizi öneririm (kullanmayanlar için faydalıdır bash.)
Wildcard

1
~+aynı şekilde bir kısayol"$PWD"
Paul Evans

11

Bu durumun bir kereye mahsus olduğunu gördüm, şunu yapabilirim:

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

Kendimi yarı düzenli dosyalardan kopyalarken bulduğum dizinler olsaydı, muhtemelen benim .profile dosyamda bazı anımsatıcı değişkenler tanımlardım.

Eklemek için düzenlendi:

Üzerinde uyuduktan sonra, bazı dosyaları seçtiğiniz, "kestik" veya "kopyala", sonra da başka bir yere "yapıştır" diyerek diğer GUI / OS davranışlarına ne kadar yaklaşabileceğimi merak ettim. Bulabildiğim en iyi seçim mekanizması beyniniz / tercihleriniz ve kabuğun toparlama özelliği idi. Adlandırma konusunda pek yaratıcı değilim, ama temel fikir bu (Bash sözdiziminde):

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
}

Kullanmak için, kodu ~ / .bash_profile dosyasına, sonra cdkaynak dizine koyun ve ya copyfiles glob*hereda komutunu çalıştırın cutfiles glob*here. Olan tek şey kabuğunuzun küreleri genişletmesi ve bu dosya adlarını bir diziye koymasıdır. Daha sonra cdhedef dizine ve her kaynak dosya için pastefilesbir cpkomut yürüten çalıştır . Dosyaları daha önce "kestiyseniz", yapıştırma dosyaları kaynak dosyayı da kaldırır (veya dener). Bu herhangi bir hata kontrolü yapmaz (varolan dosyaların, potansiyel olarak onları kapatmadan önce cp; ya da bir "kesim" sırasında dosyaları kaldırma izniniz vardır ya da taşıdıktan sonra kaynak dizine yeniden erişebilirsiniz. onun).


4
One- $OLDPWDoff'unuz için zaten ~-bash ve zsh olarak kısaltılabilen var .
Gilles 'SO- kötülük' dur

5

Bence ~-doğru cevap, fakat bash'ın metni kopyalayabilecek / yapıştırabilecek yerleşik bir çizgi editörüne sahip olduğunu unutmayın .

Eğer emacs modunda ise size çağırabilirsiniz cdgeçmişinizden komutu ve kullanımı Control-uiçin öldürmek öldürmek halkası denilen bash "panoya" konusunda çizgiyi (başka yolları da vardır). Daha sonra olabilir yank ile her an yeni bir komuta içine bu dize Control-y. Açıkçası, örneğinizde bu, emrinizde mutlak bir dizin adı kullandığınıza bağlıdır cd.

Ayrıca ilginç varsayılan tuş ciltleme özelliğini de kullanabilirsiniz Meta-.. Bu , son komutu önceki komuttan mevcut satırınıza kopyalar . Eğer tekrarlanırsa, her seferinde geçmişe bir komut geri gider. Yani eğer yaparsanız cd /x, ardından cd /ygirdiğiniz girdide cdMeta-.Meta-.olacaksınız /x.


5

Anderson M. Gomes'den gelen cevabı genişleterek , Bash, dizin yığındaki konumun nerede olduğunu ~N(veya ~+N) yazarak dizininizdeki herhangi bir dizine başvurmanızı sağlar N. Örneğin:

# 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

Artık bir dosyayı geçmiş iki dizin arasına kopyalayabilirsiniz, ikisi de geçerli olanı değil:

cp -v ~3/file1.txt ~2

Orijinal posterin problemini çözmek için şunları yaparsınız:

$ 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 .

Çok sayıda dosya ile, isimlerini bir manifest dosyasında listeleyebilir ve daha sonra kopyayı kaynak dizinden yapabilirsiniz:

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

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

Ayrıca bakınız: Bash man sayfasının bu bölümü


Benzer şekilde, Tcsh'da dir dizinizdeki ikinci dizine işaret etmek için =2gösterimi (yerine ~2) kullanabilirsiniz.

Ayrıca bakınız: Tcsh man sayfasının bu bölümü


4

ilk dizindeyken, kaynak veya srckısaca yürütelim

src=${PWD}

sonra cdikinci dizine girin ve çalıştır:

cp -i ${src}/filename .

-iÜzerine yazmak istediğiniz yerine yinelenen dosya varsa seçeneği soracaktır


Teşekkürler. Dosya adı belirtilmeden daha iyidir.
Tim

4

Anderson-m-gomes yanıtında bir değişiklik Bash'i kullanarak sadece dizinleri ziyaret ederdim:

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

Ardından, önceki dizine işaret eden $ OLDPWD değişkenini kullanırdım:

$ cp -v $OLDPWD/file1.txt .

Bir kişi dizinleri ters sırada ziyaret etmek isterse, o zaman:

$ cp -v fileA.txt $OLDPWD/

3
+1, ancak değişken açılımlarınızı "alıntı" yapmayı unuttunuz. $OLDPWDBoşluklar varsa , bu kopar. Ayrıca, her zaman kullanırım cp -a. Ayrıca, sekme tamamlamanın değişken açılımlarda kırılması talihsiz bir durumdur. $ OLDPWD bölümünü yazdıktan sonra, mevcut komut satırını kabuk genişletmek için ctrl-alt-e kullanabilirsiniz.
Peter Cordes

1
~-kısayoludur$OLDPWD
Gilles 'SO- kötülük' dur

Unix / Linux onlarla dolu olduğu için başka bir varyasyonu işaret ediyordum. Komik,> 20 yıldır Linux kullanıyorum ve daha önce hiç görmedim. Artı, $ OLDPWD'nin hatırlanması kolaydır.
Scott Carlson

3

Eğer bash ise, pushd ve popd kullanırdım . Bu komutlar daha sonra kullanmak üzere kullanışlı bir FIFO dizin yığını tutar. Dizleri kullanarak istediğiniz zaman yığına başvurabilirsiniz .

Gibi ben yapardım:

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

2

Kullanabilirsiniz 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.

Örnek:

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

Ayrıca xsel'i ziyaret edin .


Bu tar | gzip, X panosuna bir giriş / çıkış yapar . Biraz kıyaslanıp cp, sembolik veya hardlinks yapmak için genel değildir. ( cp -asveya cp -al)
Peter Cordes

1

clipboard-filesBuradaki betiği kontrol edebilirsiniz : https://github.com/larspontoppidan/clipboard-files

Bu gibi komutları içerir ccopy, ccutve cpastemasaüstü ortamı panosunu kullanın ve dosyaların yapıştırarak / sezgisel kopyasını sağlamasıdır:

ccopy myfile
cd <second directory>
cpaste

Masaüstü ortamı panosu kullanıldığında, kopyalama / yapıştırma, dosya yöneticileri ve IDE'ler gibi diğer programlarda panoya yerleştirilen dosyalarla etkileşime girer. En azından Gnome benzeri masaüstlerinde çalışıyor.

Tam açıklamada, senaryoyu orada gibi bir şey bularak pes ettikten sonra yazdım ...

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.