Papan klip untuk menyalin dan menempel file di baris perintah?

25

Di Bash, misalkan saya mengunjungi direktori, dan lalu direktori lain. Saya ingin menyalin file dari direktori pertama ke direktori kedua, tetapi tanpa menentukan nama path panjang dari mereka. Apa itu mungkin?

Solusi sementara saya adalah menggunakan /tmpsebagai tempat sementara untuk menyimpan salinan file.cp myfile /tmpketika saya berada di direktori pertama, dan kemudian cp /tmp/myfile .ketika saya berada di direktori kedua. Tapi saya dapat memeriksa apakah file akan menimpa apa pun di /tmp.

Apakah ada yang mirip dengan clipboard untuk menyalin dan menempelkan file?

Tim
sumber
1
Anda harus mengetikkan cdperintah, sehingga Anda dapat hanya cd -untuk kembali ke direktori sebelumnya, up-panah untuk mengingat cdperintah, dan mengedit garis menjadi cpbukan cd. (ctrl-a (awal-line-), alt-d (kill-word) cp -a,, ctrl-e (akhir-of-line)).
Peter Cordes
Dengan Emacs dan M-x termAnda dapat menggunakan papan klip Emacs.
Pål GD
1
Anda dapat menggunakan Midnight Commander dan lupakan tentang melompat melalui lingkaran.
Deer Hunter
@ PålGD Orang bilang Emacs 'adalah sistem operasi ... Sebagian besar memiliki clipboard;)
Volker Siegel
@JeffSchaller, terima kasih ................................
Tim

Jawaban:

59

Menggunakan Bash, saya hanya akan mengunjungi direktori:

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

Lalu, saya akan menggunakan jalan pintas ~-, yang menunjuk ke direktori sebelumnya:

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

Jika seseorang ingin mengunjungi direktori dengan urutan terbalik, maka:

$ cp -v fileA.txt ~-
$ cp -v fileB.txt ~-
$ cp -v fileC.txt ~-
Anderson Medeiros Gomes
sumber
25
+1 Saya menggunakan kerang Unix / Linux selama lebih dari 20 tahun sekarang, dan saya tidak tahu jalan pintas itu.
Dubu
4
Huh, itu jalan pintas yang praktis untuk "$OLDPWD". Mengapa tiga cpperintah terpisah ? cp -a ~-/file[1-3].txt .
Peter Cordes
4
Sebenarnya, ketiganya cpadalah contoh. Di dunia nyata, karakter wildcard juga dapat digunakan untuk menyederhanakan tugas salin.
Anderson Medeiros Gomes
2
Saya akan menyebutkan sesuatu tentang pushddan penguraian dirs... tapi ini jauh, jauh lebih baik. Saya sarankan Anda menambahkan fakta yang "$OLDPWD"persis sama dengan ~-dan lebih portabel (bermanfaat bagi mereka yang tidak menggunakan bash.)
Wildcard
1
~+juga merupakan jalan pintas untuk"$PWD"
Paul Evans
11

Jika saya melihat situasi itu datang sekali, saya mungkin:

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

Jika ada direktori yang saya temukan menyalin file secara tidak teratur, saya mungkin akan mendefinisikan beberapa variabel mnemonic untuk mereka di .profile saya.

Diedit untuk menambahkan:

Setelah tidur di atasnya, saya bertanya-tanya seberapa dekat saya bisa dengan perilaku GUI / OS lain di mana Anda memilih beberapa file, "potong" atau "salin" mereka, kemudian "tempel" mereka di tempat lain. Mekanisme seleksi terbaik yang bisa saya buat adalah otak / preferensi Anda ditambah fitur globbing shell. Saya tidak terlalu kreatif dalam penamaan, tetapi ini adalah ide dasar (dalam sintaks Bash):

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
}

Untuk menggunakannya, masukkan kode ke ~ / .bash_profile, lalu cdke direktori sumber dan jalankan salah satu copyfiles glob*hereatau cutfiles glob*here. Semua yang terjadi adalah shell Anda memperluas gumpalan dan menempatkan nama file ke dalam array. Anda kemudian cdke direktori tujuan dan menjalankan pastefiles, yang mengeksekusi cpperintah untuk setiap file sumber. Jika sebelumnya Anda "memotong" file, maka pastefile juga menghapus file sumber (atau, mencoba untuk). Ini tidak melakukan pengecekan kesalahan (dari file yang ada, sebelum berpotensi mengalahkan mereka dengan cp; atau bahwa Anda memiliki izin untuk menghapus file selama "pemotongan", atau bahwa Anda dapat mengakses kembali direktori sumber setelah Anda pindah) itu).

Jeff Schaller
sumber
4
Untuk sekali pakai Anda, $OLDPWDsudah ada, yang dapat disingkat menjadi ~-bash dan zsh.
Gilles 'SANGAT berhenti menjadi jahat'
5

Saya pikir itu ~-adalah jawaban yang tepat, tetapi perhatikan bahwa bash memiliki editor garis bawaan yang dapat menyalin / menempelkan teks.

Jika Anda berada dalam mode emacs, Anda dapat mengingat cdperintah Anda dari histori, dan gunakan Control-uuntuk membunuh baris ke bash "clipboard" yang disebut kill-ring (ada juga cara lain). Anda kemudian dapat menarik string ini menjadi perintah baru kapan saja dengan Control-y. Jelas, dalam contoh Anda ini tergantung pada Anda telah menggunakan nama direktori absolut dalam cdperintah Anda .

Anda juga dapat menggunakan pengikatan kunci default yang menarik Meta-.. Ini menyalin kata terakhir dari perintah sebelumnya ke baris Anda saat ini. Jika diulang, setiap kali kembali satu perintah dalam sejarah. Jadi, jika Anda melakukan cd /x, maka cd /ydiikuti oleh cdMeta-.Meta-.Anda akan memiliki /xdi masukan Anda.

meuh
sumber
5

Memperluas jawaban dari Anderson M. Gomes , Bash memungkinkan Anda untuk merujuk ke direktori sebelumnya di tumpukan direktori Anda dengan mengetik ~N(atau ~+N) di mana Nposisi pada tumpukan direktori. Sebagai contoh:

# 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

Sekarang Anda dapat menyalin file di antara dua direktori sebelumnya, tidak satu pun dari yang sekarang, dengan:

cp -v ~3/file1.txt ~2

Untuk mengatasi masalah poster asli, Anda harus:

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

Dengan sekumpulan file besar, Anda bisa mendaftar nama mereka dalam file manifes dan kemudian melakukan salinan dari dir sumber:

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

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

Lihat juga: ini bagian dari halaman manual Bash


Demikian pula, di Tcsh, Anda dapat menggunakan =2 notasi (daripada ~2) untuk merujuk ke dir kedua pada tumpukan dir Anda.

Lihat juga: ini bagian dari halaman manual Tcsh

Jskroch
sumber
4

ketika Anda berada di direktori pertama, katakanlah sumber atau srcsingkatnya, jalankan

src=${PWD}

lalu cdke direktori kedua dan jalankan:

cp -i ${src}/filename .

yang -ipilihan akan menanyakan apakah Anda ingin menimpa, jika ada file duplikat

MelBurslan
sumber
Terima kasih. Itu bahkan lebih baik tanpa menentukan nama file.
Tim
4

Variasi pada respons anderson-m-gomes. Menggunakan Bash, saya hanya akan mengunjungi direktori:

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

Kemudian, saya akan menggunakan variabel $ OLDPWD, yang menunjuk ke direktori sebelumnya:

$ cp -v $OLDPWD/file1.txt .

Jika seseorang ingin mengunjungi direktori dengan urutan terbalik, maka:

$ cp -v fileA.txt $OLDPWD/
Scott Carlson
sumber
3
+1, tetapi Anda lupa "mengutip" ekspansi variabel Anda. Jika $OLDPWDberisi spasi, ini pecah. Juga, saya selalu menggunakan cp -a. Juga, sangat disayangkan bahwa penyelesaian tab rusak pada ekspansi variabel. Anda dapat menggunakan ctrl-alt-e untuk shell-perluas baris perintah saat ini, setelah mengetik bagian $ OLDPWD.
Peter Cordes
1
~-adalah jalan pintas untuk$OLDPWD
Gilles 'SO- stop being evil'
Saya baru saja menunjukkan variasi lain, karena Unix / Linux penuh dengan mereka. Lucu, saya sudah menggunakan Linux selama> 20 tahun, dan saya belum pernah melihat ~ - sebelumnya. Plus, $ OLDPWD mudah diingat.
Scott Carlson
3

Jika dalam bash, saya akan menggunakan pushd dan popd . Perintah-perintah ini menyimpan tumpukan direktori FIFO yang berguna untuk digunakan nanti. Anda dapat berkonsultasi dengan stack kapan saja menggunakan dirs .

Dengan demikian saya akan lakukan:

pushd .
cd /somewhere/else
cp "`popd`/myfile"
Rui F Ribeiro
sumber
2

Anda bisa menggunakan 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.

Contoh:

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

Kunjungi juga xsel .

Pandya
sumber
Itu tar | gzipmasuk / keluar dari clipboard X. Agak kikuk dibandingkan dengan cp, dan tidak menggeneralisasi untuk membuat symlink atau hardlink. ( cp -asatau cp -al)
Peter Cordes
1

Anda dapat memeriksa clipboard-filesskrip di sini: https://github.com/larspontoppidan/clipboard-files

Ini memberikan perintah seperti ccopy, ccutdan cpasteyang menggunakan clipboard lingkungan desktop dan memungkinkan penyalinan / menempel file secara intuitif:

ccopy myfile
cd <second directory>
cpaste

Saat clipboard lingkungan desktop digunakan, copy / paste akan berinteraksi dengan file yang diletakkan di clipboard dalam program lain seperti manajer file dan IDE. Setidaknya itu berfungsi pada desktop seperti Gnome.

Pengungkapan penuh, saya menulis naskah setelah menyerah menemukan sesuatu seperti itu di luar sana ...

Larsp
sumber