これは、なにをしたくて書いたもの?
Linuxでクリップボードを操作するのに、xclipというコマンドがあるのを知りまして。
覚えておくと便利そうかなと思ったので、ちょっとメモしておくことにしました。
xclip、xsel
クリップボードにデータをコピーしたり、クリップボードにコピーした値を標準出力に書き出すコマンドとしてxclipがあります。
Ubuntu Manpage: xclip - command line interface to X selections (clipboard)
xclipをインストールすると利用可能になるコマンドとして、他にxclip-copyfile、xclip-cutfile、xclip-pastefileもあります。
また、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
xclipを使う時には、コピー先・出力元としてこのセレクションの中から選択することになります。
コピーした内容をCtrl+vで貼り付けたかったらCLIPBOARDを指定するので、主にCLIPBOARDを使うことになるのではないかなと思います。
xclipでは、以下の表現で指定します。
- PRIMARY …
primaryorp - SECONDARY …
secondaryorsec - CLIPBOARD …
clipboardorcliporc
というか、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を使って、コマンドラインでクリップボードにデータをコピーしたり、ファイルを操作したりしてみました。
今まであまりこういう発想がなかったのですが、できることを覚えておくと便利そうですね。