Bashで、あるディレクトリにアクセスし、次に別のディレクトリにアクセスするとします。最初のディレクトリから2番目のディレクトリにファイルをコピーしたいのですが、それらの長いパス名を指定していません。出来ますか?
私の一時的な解決策は、/tmp
ファイルのコピーを保存する一時的な場所として。 cp myfile /tmp
最初のディレクトリにいるとき、次にcp /tmp/myfile .
2番目のディレクトリにいるとき。しかし、ファイルが/tmp
。
ファイルをコピーして貼り付けるためのクリップボードのようなものはありますか?
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
で破壊する前に)エラーチェックを行わないか、「カット」中にファイルを削除する権限があるか、またはそこから移動した後のソースディレクトリ)。
私は思います ~-
が正解ですが、bashには組み込みの行エディタがあり、テキストをコピー/貼り付けできることに注意してください。
Emacsモードの場合は、cd
コマンドを履歴から呼び出して使用できます。 Control-u tokillキルリングと呼ばれるbash "クリップボード"への行(他の方法もあります)。次に、この文字列をyankして、いつでも新しいコマンドに入れることができます Control-y。明らかに、あなたの例では、これはcd
コマンドで絶対ディレクトリ名を使用したかどうかに依存します。
興味深いデフォルトのキーバインディングを使用することもできます Meta-.。これは最後のワードをコピーする前のコマンドから現在の行にコピーします。繰り返される場合、履歴内の1つのコマンドに戻るたびに。したがって、cd /x
、次にcd /y
に続いてcd
Meta-.Meta-./x
を入力します。
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
同様に、Tcshでは、=2
表記ではなく~2
表記を使用して、dirスタックの2番目のdirを参照できます。
最初のディレクトリにいるときは、ソースまたはsrc
と言ってみましょう。
src=${PWD}
次にcd
を2番目のディレクトリに移動して実行します。
cp -i ${src}/filename .
-i
オプションは、重複するファイルがある場合、上書きするかどうかを尋ねます
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/
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 もご覧ください。
ここでclipboard-files
スクリプトをチェックアウトできます: https://github.com/larspontoppidan/clipboard-files
ccopy
、ccut
、cpaste
などのコマンドを提供し、デスクトップ環境のクリップボードを使用して、ファイルの直感的なコピー/貼り付けを可能にします。
ccopy myfile
cd <second directory>
cpaste
デスクトップ環境のクリップボードが使用されているため、コピー/貼り付けは、ファイルマネージャーやIDEなどの他のプログラムでクリップボードに置かれたファイルと相互作用します。少なくともGnomeのようなデスクトップで動作します。
完全な開示、私はそこにそのような何かを見つけることをあきらめた後にスクリプトを書きました...