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


25

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

私の一時的な解決策は/tmp、ファイルのコピーを保存する一時的な場所として使用することです。cp myfile /tmp最初のディレクトリにいるcp /tmp/myfile .とき、次に2番目のディレクトリにいるとき。しかし、ファイルがで何かを上書きするかどうかをチェックするかもしれません/tmp

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


1
あなたは入力する必要がcdあなただけのことができるように、コマンドをcd -リコールする上矢印、前のディレクトリに戻るcdように行をコマンド、および編集cpの代わりにcd。(ctrl-a(行頭)、alt-d(kill-word)cp -a、、 ctrl-e(行末))。
ピーターコーデス

Emacsでは、M-x termEmacsのクリップボードを使用できます。
PAL GD

1
Midnight Commanderを使用して、フープをジャンプすることを忘れることができます。
鹿ハンター

@PålGD人々はEmacsがオペレーティングシステムであると言います...ほとんどがクリップボードを持っています;)
Volker Siegel

@JeffSchallerのおかげで................................
ティム

回答:


59

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 ~-

25
+1私は現在20年以上Unix / Linuxシェルを使用していますが、そのショートカットを知りませんでした。
ドゥブ

4
ええ、それはの便利なショートカットです"$OLDPWD"cpしかし、なぜ3つの別々のコマンドですか? cp -a ~-/file[1-3].txt .
ピーターコーデス

4
実際には、3つcpは例です。現実の世界では、ワイルドカード文字を使用してコピータスクを簡素化することもできます。
アンダーソンメデイロスゴメス

2
私は何かについて言及しpushd、解析するつもりだったdirs...しかし、これははるかに優れています。"$OLDPWD"正確に同等で~-、より移植性が高いという事実を追加することをお勧めします(。を使用していない場合に役立ちますbash)。
ワイルドカード

1
~+同様にショートカットです"$PWD"
Paul Evans

11

その状況が一時的なものだと思ったら、次のように考えます。

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、宛先ディレクトリに移動し、実行してpastefilescp各ソースファイルに対してコマンドを実行します。以前にファイルを「カット」した場合、pastefilesはソースファイルも削除します(または、削除しようとします)。これは、既存のファイルのエラーチェックを行いませんcp;で潜在的にそれらを上書きする前に、または「カット」中にファイルを削除する権限があるか、移動後にソースディレクトリに再アクセスできますそれの)。


4
1回限りの場合は、bashとzshで$OLDPWD短縮できる既に存在します~-
ジル 'SO-悪であるのをやめる'

5

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

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

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


5

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

# 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ページのこのセクション


4

あなたが最初のディレクトリにいるとき、ソースを言うかsrc、要するに、実行する

src=${PWD}

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

cp -i ${src}/filename .

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


ありがとう。ファイル名を指定せずにさらに良いです。
ティム

4

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/

3
+1、しかし変数展開を「引用」するのを忘れた。$OLDPWDスペースが含まれる場合、これは壊れます。また、私は常に使用しますcp -a。また、変数展開でタブ補完が壊れているのは残念です。ただし、$ OLDPWD部分を入力した後、ctrl-alt-eを使用して現在のコマンドラインをシェル拡張できます。
ピーターコーデス


Unix / Linuxにはそれらがいっぱいあるため、別のバリエーションを指摘していました。おもしろいことに、Linuxを20年以上使ってきましたが、これまでに見たことはありませんでした。さらに、$ OLDPWDは覚えやすいです。
スコットカールソン

3

bashの場合、pushdpopdを使用します。これらのコマンドは、後で使用するためにディレクトリの便利なFIFOスタックを保持します。dirsを使用すると、いつでもスタックを参照できます。

そのため、私はそうします:

pushd .
cd /somewhere/else
cp "`popd`/myfile"

2

使用できます 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もご覧ください


これはtar | gzip、Xクリップボードの出入りを行います。やや不格好ですがcp、シンボリックリンクやハードリンクの作成には一般化されていません。(cp -asまたはcp -al
ピーターコーデス

1

clipboard-filesここでスクリプトを確認できます:https : //github.com/larspontoppidan/clipboard-files

それは次のようにコマンドを提供しccopyccutそしてcpasteデスクトップ環境のクリップボードを使用して、ファイルの貼り付け/直感的なコピーを許可しています:

ccopy myfile
cd <second directory>
cpaste

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

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.