web-dev-qa-db-ja.com

コマンドラインでファイルをコピーして貼り付けるためのクリップボード?

Bashで、あるディレクトリにアクセスし、次に別のディレクトリにアクセスするとします。最初のディレクトリから2番目のディレクトリにファイルをコピーしたいのですが、それらの長いパス名を指定していません。出来ますか?

私の一時的な解決策は、/tmpファイルのコピーを保存する一時的な場所として。 cp myfile /tmp最初のディレクトリにいるとき、次にcp /tmp/myfile . 2番目のディレクトリにいるとき。しかし、ファイルが/tmp

ファイルをコピーして貼り付けるためのクリップボードのようなものはありますか?

25
Tim

Bashを使用して、次のディレクトリにアクセスします。

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

次に、前のディレクトリを指すショートカット~-を使用します。

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

逆の順序でディレクトリにアクセスする場合は、次のようにします。

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

そのような状況が一時的なものであると思った場合、私は次のことを行うでしょう。

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

私が自分でファイルを半定期的にコピーしていることに気付いたディレクトリがある場合は、おそらく、.profileでそれらのニーモニック変数をいくつか定義します。

追加するように編集:

その上で眠った後、いくつかのファイルを選択し、それらを「カット」または「コピー」し、それから別の場所に「ペースト」する他のGUI/OSの動作にどれほど近づくことができるかと思いました。私が思いつくことができる最良の選択メカニズムは、あなたの脳/好みとシェルのグロビング機能でした。私はネーミングに関してあまりクリエイティブではありませんが、これは(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
}

これを使用するには、コードを〜/ .bash_profileに入れ、次にcdをソースディレクトリに入れて、copyfiles glob*hereまたはcutfiles glob*hereを実行します。シェルがグロブを展開し、それらのファイル名を配列に入れるだけです。次に、宛先ディレクトリにcdし、pastefilesを実行します。これにより、各ソースファイルに対してcpコマンドが実行されます。以前にファイルを「カット」していた場合、pastefilesはソースファイルも削除します(または削除しようとします)。これは、(既存のファイルをcpで破壊する前に)エラーチェックを行わないか、「カット」中にファイルを削除する権限があるか、またはそこから移動した後のソースディレクトリ)。

11
Jeff Schaller

私は思います ~-が正解ですが、bashには組み込みの行エディタがあり、テキストをコピー/貼り付けできることに注意してください。

Emacsモードの場合は、cdコマンドを履歴から呼び出して使用できます。 Control-u tokillキルリングと呼ばれるbash "クリップボード"への行(他の方法もあります)。次に、この文字列をyankして、いつでも新しいコマンドに入れることができます Control-y。明らかに、あなたの例では、これはcdコマンドで絶対ディレクトリ名を使用したかどうかに依存します。

興味深いデフォルトのキーバインディングを使用することもできます Meta-.。これは最後のワードをコピーする前のコマンドから現在の行にコピーします。繰り返される場合、履歴内の1つのコマンドに戻るたびに。したがって、cd /x、次にcd /yに続いてcdMeta-.Meta-./xを入力します。

5
meuh

Anderson M. Gomesからの回答 を展開すると、Bashでは~N(または~+N)と入力して、ディレクトリスタック内の以前のディレクトリを参照できます。ここで、Nは、dirスタック上の位置です。例えば:

# 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

これで、次のようにして、2つの過去のディレクトリ間でファイルをコピーできます。どちらも現在のディレクトリではありません。

cp -v ~3/file1.txt ~2

元の投稿者の問題を解決するには、次のようにします。

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

ファイルの大きなセットを使用すると、マニフェストファイルにファイル名をリストして、ソースディレクトリからコピーできます。

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

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

参照: Bash manページのこのセクション


同様に、Tcshでは、=2表記ではなく~2表記を使用して、dirスタックの2番目のdirを参照できます。

参照: Tcsh manページのこのセクション

5
jskroch

最初のディレクトリにいるときは、ソースまたはsrcと言ってみましょう。

src=${PWD}

次にcdを2番目のディレクトリに移動して実行します。

cp -i ${src}/filename .

-iオプションは、重複するファイルがある場合、上書きするかどうかを尋ねます

4
MelBurslan

Anderson-m-gomes応答のバリエーション。 Bashを使用して、次のディレクトリにアクセスします。

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

次に、前のディレクトリを指す変数$ OLDPWDを使用します。

$ cp -v $OLDPWD/file1.txt .

逆の順序でディレクトリにアクセスする場合は、次のようにします。

$ cp -v fileA.txt $OLDPWD/
4
Scott Carlson

Bashの場合、 pushd および popd を使用します。これらのコマンドは便利なFIFO後で使用するためのディレクトリのスタックです。 dirs を使用していつでもスタックを調べることができます。

そのように私はやります:

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

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.

例:

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

xsel もご覧ください。

2
Pandya

ここでclipboard-filesスクリプトをチェックアウトできます: https://github.com/larspontoppidan/clipboard-files

ccopyccutcpasteなどのコマンドを提供し、デスクトップ環境のクリップボードを使用して、ファイルの直感的なコピー/貼り付けを可能にします。

ccopy myfile
cd <second directory>
cpaste

デスクトップ環境のクリップボードが使用されているため、コピー/貼り付けは、ファイルマネージャーやIDEなどの他のプログラムでクリップボードに置かれたファイルと相互作用します。少なくともGnomeのようなデスクトップで動作します。

完全な開示、私はそこにそのような何かを見つけることをあきらめた後にスクリプトを書きました...

1
Larsp