menggunakan terminal untuk menyalin file ke clipboard

159

Saya mendapat file di desktop, nama file adalah ded.html. Untuk menyalin file, saya klik file dan tekan cmd + c.

Sekarang bagaimana caranya melakukan hal yang sama menggunakan terminal?

kiwi yang marah
sumber
2
Apakah maksud Anda menyalin file atau menyalin konten file sehingga konten dapat disisipkan?
user151019

Jawaban:

237

Jika saya memahami pertanyaan dengan benar, apa yang Anda cari adalah pbcopydan pbpaste.

Buka terminal dan lakukan:

$ cat ~/Desktop/ded.html | pbcopy

Sekarang file itu ada di clipboard.

Untuk meletakkannya di tempat lain, yaitu, untuk menempelkannya, lakukan:

$ pbpaste > ~/Documents/ded.html

Sekarang Anda harus memiliki salinan ded.html di ~ / Documents.

boehj
sumber
3
Ini bagus untuk bekerja dengan file teks, tetapi akan gagal ketika Anda mencoba melakukan tugas dengan binari. Coba ini dengan gambar untuk melihat apa yang saya maksud.
Itai Ferber
7
setelah mengetik $ cat ~ / Desktop / ded.html | pbcopy Saya tidak bisa menggunakan cmd + v untuk menempelkan file. Meskipun $ pbpaste> ~ / Documents / ded.html melakukan pekerjaan.
Kiwi
Anda juga dapat melihat konten file di clipboard OSX Anda dengan pergi melalui menu Finder Edit> Show Clipboard (diuji dalam Yosemite).
Dannid
Terima kasih, ada ide bagaimana saya membacanya dan meneruskannya ke perintah selanjutnya? misalnya cat ~/.emulator_console_auth_token | auth <read_content>?
Dominic
Ini menyalin isi file, tetapi bukan file itu sendiri.
vy32
20

Jawaban Lri mengarah ke arah yang benar, tetapi memiliki beberapa kelemahan: tidak perlu menggunakan Finder ( the clipboardmerupakan bagian dari StandardAdditions OSAX), dan memberikan runpawang adalah cara yang jauh lebih dapat diandalkan untuk menyampaikan argumen dari baris perintah (sejak 10.4). Membuat kedua perubahan ini sangat menyederhanakan "melarikan diri" yang perlu dilakukan untuk memasukkan program ke dalam shell.

Ini versi saya (dibungkus dengan fungsi shell — Anda bisa memasukkan ini (mis.) Untuk .bashrcmembuatnya tersedia di shell Anda):

file-to-clipboard() {
    osascript \
        -e 'on run args' \
        -e 'set the clipboard to POSIX file (first item of args)' \
        -e end \
        "$@"
}

file-to-clipboard ~/Desktop/ded.html

File yang telah diletakkan di clipboard dengan skrip ini kemudian dapat ditempelkan di Finder untuk menyalin file ke folder lain.

osascript juga dapat digunakan sebagai juru bahasa hash-bang (sejak 10.5). Masukkan ini ke dalam file (mis. file-to-clipboard)

#!/usr/bin/osascript
on run args
  set the clipboard to POSIX file (first item of args)
end

Jadikan file tersebut dapat dieksekusi ( chmod +x /path/to/where/ever/you/put/file-to-clipboard). Kemudian jalankan seperti ini:

/path/to/where/ever/you/put/file-to-clipboard ~/Desktop/ded.html

Jika disimpan dalam direktori di PATH, maka Anda dapat menghilangkan path ke file "script".

Chris Johnsen
sumber
@Lri: Finder tidak memahami yang jelas set the clipboard to {one,two}(meskipun program AppleScript lain dapat berhasil mengekstrak daftar). The StandardAdditions clipboard perintah mungkin terbatas pada item tunggal.
Chris Johnsen
1
Apakah ini berfungsi untuk banyak file?
VitalyB
Catatan: Jalur yang diberikan harus merupakan jalur absolut agar skrip berfungsi.
Leo
8

Tidak ada cara untuk mencapai apa yang Anda coba lakukan menggunakan baris perintah. Sementara Apple menawarkan pbcopydan pbpastealat - alat untuk memungkinkan penyalinan teks dasar, Anda tidak dapat menggunakan alat-alat ini untuk menyalin file dalam arti yang Anda cari.

Tanpa terlalu banyak detail teknis, ketika Anda 'menyalin' file di Finder menggunakan C, Anda sebenarnya tidak menyalin file itu sendiri, hanya membuat referensi ke file di clipboard dan menandainya sebagai referensi file. Ketika sebuah aplikasi menerima referensi ini ketika Anda menempel, itu memiliki tanggung jawab untuk memilah-milah, mencari tahu apa yang Anda tempel, dan akhirnya, bekerja dengan file sesuai keinginan. Intinya, ketika Anda menyalin file di Finder, itu menyimpan path ke file dengan cara tertentu ke clipboard tertentu, dan ketika Anda menempel, itu menerima path file itu dan tahu untuk membuat file baru menggunakan konten dari yang lama (salin file ke clipboard, hapus, coba tempel di tempat lain, dan lihat apa yang terjadi, misalnya).

Dalam hal menyalin dan menempel, alat yang tersedia tidak cukup untuk melakukan apa yang Anda butuhkan. Seperti yang disarankan boehj, Anda dapat mencoba menyalin konten dari file lama ke yang baru, tetapi ini hanya akan berfungsi dengan baik untuk file teks. Setiap file biner yang Anda dapatkan akan rusak (coba lakukan ini dengan gambar - itu menjadi rusak).

Baris perintah tradisional akan gagal Anda dengan cara ini, tetapi Anda dapat melihat jika Anda ingin dalam melakukan hal ini di AppleScript, kemudian memohon bahwa melalui baris perintah dengan osascript.

Itai Ferber
sumber
Anda benar tentang gambar, dll. Saya tidak memikirkan itu. Saya kira saya telah salah paham pertanyaannya, karena meskipun pbcopydan pbpasteakan bekerja dengan file .html, itu hanya karena kebetulan itu adalah file teks.
boehj
Tidak, Anda memahami pertanyaan dengan benar, hanya saja Anda menganggap alat ini berfungsi sebagaimana mestinya, padahal sebenarnya tidak. Mereka buggy, dan bahkan tidak dimaksudkan untuk bekerja seperti itu, meskipun Apple telah melakukan pekerjaan yang sangat buruk pada dokumentasi. Jika Anda mengetik pbcopy -help, Anda mendapatkan garis yang tidak layak produksi NSLog()hanya mengulangi 'pbcopy -help'. Ini membantu untuk menjadi seorang programmer untuk memahami ini, itulah sebabnya saya merasa perlu untuk berpadu.
Itai Ferber
1
Yap, tidak masalah. ;)
Itai Ferber
1
Siapa pun yang ingin pbcopy mendapatkan perhatian mungkin mendapatkan akun pengembang gratis dan mengajukan beberapa bug - bugreport.apple.com - tidak ada jaminan itu akan membantu, tetapi memberikan para insinyur leverage untuk mendapatkan waktu untuk mengerjakan hal-hal ini jika cukup banyak orang yang masih peduli .
bmike
1
Bisakah OP mencapai apa yang mereka inginkan dengan AppleScript di CLI?
7

Fungsi di bawah ini hanya berfungsi dengan satu file dan tidak dengan banyak file. Ini membutuhkan GNU readlinkyang dapat Anda instal dengan menjalankan brew install findutils.

copy(){ osascript -e{'on run{a}','set the clipboard to posix file a',end} "$(greadlink -f -- "$1")";}

Sunting: Saya menghapus tell app "Finder"blokir.

Sunting 2: Dikembalikan ke versi yang mendukung jalur relatif.

Lri
sumber
2
Ini benar-benar berfungsi!
Bemmu
6

Pelaksana pbcopy < filenameperintah di Terminal salinan isi dari file bernama filename.

Shinxg
sumber
3

Untuk menyalin file ke tujuan, gunakan cpperintah.

cp /path/to/file /path/to/destination

Lihat man cpuntuk informasi lebih lanjut.

Graham
sumber
2
Ini bukan jawaban atas pertanyaan yang diajukan yang merujuk clipboard sebagai lokasi target.
kellyfj
2

Berikut skrip Shell / Bash sederhana. Cukup tempel di .bashrcfile Anda (atau sejenisnya):

file-to-clipboard() {
    if [ -z "$1" ]; then
        echo "file path/name:"
        read FILE
    else
        FILE="$1"
    fi
    pbcopy < "$FILE"
}
blizzrdof77
sumber
0

Dengan dukungan file relatif:

clip_img() {
    osascript -e 'on run argv' \
        -e 'set currentDir to do shell script "pwd"' \
        -e 'set the clipboard to (read POSIX file (POSIX path of (currentDir as text & (first item of argv) )) as JPEG picture)' \
        -e 'end run' "/$1"
    # osascript -e 'clipboard info'
}

jalankan clip_img path-to-fileuntuk menyalin gambar ke clipboard, dan path-to-filebisa relatif. File tersebut bisa berupa file jpeg atau png.

schemacs
sumber
-2

Anda dapat menggunakan cat 'originfile'> 'destinationfile' di lingkungan unix;

salin file tujuan originfile di windows.

Allan Felipe Murara
sumber
2
Bagaimana cara ini menempatkan file di clipboard?
GRG