CLOVER🍀

That was when it all began.

xclipを使って、コマンドラインでクリップボードにデータをコピーする

これは、なにをしたくて書いたもの?

Linuxでクリップボードを操作するのに、xclipというコマンドがあるのを知りまして。

覚えておくと便利そうかなと思ったので、ちょっとメモしておくことにしました。

xclip、xsel

クリップボードにデータをコピーしたり、クリップボードにコピーした値を標準出力に書き出すコマンドとしてxclipがあります。

Ubuntu Manpage: xclip - command line interface to X selections (clipboard)

xclipをインストールすると利用可能になるコマンドとして、他にxclip-copyfile、xclip-cutfile、xclip-pastefileもあります。

Ubuntu Manpage: xclip-copyfile, xclip-cutfile, xclip-pastefile - copy and move files via the X clipboard

また、Xでの選択内容を操作するコマンドとしてxselというものもあります。

Ubuntu Manpage: xsel - manipulate the X selection.

今回はxclipを扱います。

環境

今回の環境は、こちら。

$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 22.04.2 LTS
Release:        22.04
Codename:       jammy


$ uname -srvmpio
Linux 5.15.0-78-generic #85-Ubuntu SMP Fri Jul 7 15:25:09 UTC 2023 x86_64 x86_64 x86_64 GNU/Linux

Ubuntu Linux 22.04 LTSです。

xclipをインストールする

xclipは、aptでインストールできます。

$ sudo apt install xclip

バージョン。

$ xclip -version
xclip version 0.13
Copyright (C) 2001-2008 Kim Saunders et al.
Distributed under the terms of the GNU GPL

xclipをインストールすると、xclip-copyfile、xclip-cutfile、xclip-pastefileも使えるようになります。

$ xclip
xclip            xclip-copyfile   xclip-cutfile    xclip-pastefile

3種類のセレクション

xclipを使う前に、押さえておいた方がよさそうなのが「セレクション」というものです。

xclipでコピーする先は、「セレクション」の中から選択することになります。
選択肢としては、以下の3つです。

  • PRIMARY
  • SECONDARY
  • CLIPBOARD

クリップボード - ArchWiki

xclipを使う時には、コピー先・出力元としてこのセレクションの中から選択することになります。
コピーした内容をCtrl+vで貼り付けたかったらCLIPBOARDを指定するので、主にCLIPBOARDを使うことになるのではないかなと思います。

xclipでは、以下の表現で指定します。

  • PRIMARY … primary or p
  • SECONDARY … secondary or sec
  • CLIPBOARD … clipboard or clip or c

というか、manページ見ていると最初の1文字でよさそうです。

xclipを使ってみる

それでは、xclipを使ってみましょう。

$ echo -n 'Hello World' | xclip -selection clipboard

-selectionでセレクションを指定します。今回はclipboardを選んでいます。
これで、パイプされた内容がHello Worldがクリップボードにコピーされました。

クリップボードの内容を確認してみましょう。

$ xclip -selection clipboard -out
Hello World

Ctrl+vで、同じ内容が貼り付けられるようになっています。

ところで、コマンドがちょっと長いですね。以下のように短く書くこともできます。

$ echo -n 'Hello World' | xclip -sel c

echoは改行を含めないようにしていますが、これをxclip側で改行を除去する場合は-r(-rmlastnl)を指定します。

$ echo 'Hello World' | xclip -sel c -r

確認。

$ xclip -sel c -o
Hello World

-rを外すと、改行の有無が変わることが確認できます。

セレクションでprimaryなどを指定した場合は省略します。

ファイルの内容をクリップボードにコピーする

次は、ファイルの内容をクリップボードにコピーしてみます。

ファイルの例として、xclipのmanページをファイルに保存。

$ man xclip > xclip-man.txt

xclipにファイルを指定することで、ファイルの内容をコピーできます。

$ xclip -sel c xclip-man.txt

確認。

$ xclip -sel c -o | head -n 10
XCLIP(1)                                                                         General Commands Manual                                                                        XCLIP(1)

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.

xclip-copyfile、xclip-cutfile、xclip-pastefile

xclip-copyfile、xclip-cutfile、xclip-pastefileなど、これらのコマンドはクリップボードを使ってファイルのコピーや移動を行うことができます。

xclip-copyfileは、ファイルやディレクトリツリーの内容をクリップボードにコピーします。
xclip-cutfileは、ファイルを切り取ります。 xclip-pastefileでは、xclip-copyfile、xclip-cutfileの結果を貼り付けます。コピー元がxclip-cutfileの場合は、元のファイルがなくなるので
いわゆる「移動」になります。

たとえば、こんなファイルツリーを用意。

$ mkdir -p dir/dir2
$ echo hello > dir/hello.txt
$ echo world > dir/dir2/world.txt

xclip-copyfileでディレクトリツリーをコピー。

$ xclip-copyfile dir

別のディレクトリを作成して、移動。

$ mkdir dest
$ cd dest

xclip-pastefile。

$ xclip-pastefile
dir/
dir/hello.txt
dir/dir2/
dir/dir2/world.txt

まったく同じ構造のディレクトリツリーがコピーされました。

$ diff -r dir ../dir

これだとcpコマンドでいいのでは?と思ったりしますが、これを使ってsshでファイルをコピーする例がmanページに書かれています。

       [maggie.lkpg.cendio.se ~]$ echo "A file created on ${HOSTNAME}" > file1
       [maggie.lkpg.cendio.se ~]$ xclip-copyfile file1
       [sofie.homeip.net ~/doc]$ xclip-pastefile
       file1
       [sofie.homeip.net ~/doc]$ cat file1
       A file created on maggie.lkpg.cendio.se

続いて、xclip-cutfileでファイルを指定。

$ xclip-cutfile dir/hello.txt

適当なところでxclip-pastefile。

hello.txt

同じファイルができました。

$ cat hello.txt
hello

この時、xclip-cutfileで指定したファイルがあった場所を見ると、ファイルがなくなっています。

$ find dir -type f
dir/dir2/world.txt

つまり、クリップボードを介したファイルの切り取り移動ですね。

あと、オプションで-pを付与するとパスの情報を覚えていてくれます。

たとえば、xclip-copyfileでディレクトリ内のファイルを指定。

$ xclip-copyfile dir/hello.txt

どこか別のディレクトリに移動して、xclip-pastefile。

$ xclip-pastefile
hello.txt

ファイルがコマンドを実行したディレクトリ直下にできます。

次は、xclip-copyfileに-pオプションを指定してみます。

$ xclip-copyfile -p dir/hello.txt

xclip-pastefile時に、ディレクトリ構造を保ったままコピーしてくれました。ディレクトリがない場合は、作成してくれます。

$ xclip-pastefile
dir/hello.txt

まとめ

xclipを使って、コマンドラインでクリップボードにデータをコピーしたり、ファイルを操作したりしてみました。

今まであまりこういう発想がなかったのですが、できることを覚えておくと便利そうですね。