ディレクトリを変更せずにソースと同じパスにファイルをコピーする

ディレクトリを変更せずにソースと同じパスにファイルをコピーする

どのディレクトリ(たとえば、home)の下に次のパスがあり、~/mydir/subdir/file1コピーしたいとします。ファイル1:

ホームディレクトリでこれを行うことができます。

cp ~/mydir/subdir/file1 ~/mydir/subdir/file2

現在のディレクトリを意味するmydir/subdirように、その部分を再度繰り返す必要がないように、「ソースと同じパスに」を意味するショートカットはありますか?.それとも同じ結果を得る別の方法はありますか?

最初にできることを知っていますが、cd ~/mydir/subdir同じディレクトリに滞在できるようにする単一行ソリューションを探しています。 1つのオプションは変数を使用することですが、多くのコマンドを入力するときにもっとエレガントな方法が必要です。

オンラインで閲覧して検索しましたが、man cpそのオプションが見つかりませんでした。答えが「いいえ」なら大丈夫です。他の人が時間を節約する方法を使用したことを確認したかっただけです。ありがとうございます!

答え1

(1)を使用bashし、パスにスペースや改行(2)がないと仮定すると、次のようになります。

cp ~/mydir/subdir1/{file1,file2}

~これはbashによって(拡張とともに)拡張されます。

cp ~/mydir/subdir1/file1 ~/mydir/subdir1/file2

いつものように、次のようにテストできます。echo

echo cp ~/mydir/subdir1/{file1,file2}

コメントによると:

(1)これは他のシェルでも機能します。すべてのシェルをテストする時間はありません。

(2)「興味深い」名前の場合は、tab完成を使用するか(bash適切なエスケープが可能です)、引用符(中括弧ではない)を使用してください。

mv ./"some dir"/{"some name","other id"}

答え2

サブシェルを使用すると目的のディレクトリに移動でき( ... )、失敗しない場合はコピーを実行できます。親シェルプロセスの作業ディレクトリではなく、サブシェルの作業ディレクトリのみが影響を受けます。chdirchdirchdir

( cd ~/mydir/subdir && cp file1 file2 )

これはシェル機能で簡単に抽象化でき、タブの完成はオフセット作業ディレクトリと比較して難しくありません(少なくともZSHの場合)。

答え3

findwithを使用-execdir(サポートされている場合は元々BSDで使用されていましたが、GNUでもサポートされていますfind

ただし、指定されたコマンドは、一致するファイルを含むサブディレクトリで実行されました。

例えば

find ~/mydir/subdir/file1 -prune -execdir cp "{}" file2 \;

(このタイプが正しいこと-pruneを確認するためにfile1目次findすべてのファイルをそこにコピーすることで終わることはありませんfile2。 /なしでディレクトリをコピーするように求められた場合は、とにかく文句を言うでしょうcp-r-a

答え4

インタラクティブ、ファイル名を含むreadline編集環境を提供するicp同様のコマンドがあります。imv"renameutils"パッケージにあります。よりマニュアルページ

...$ icp   ~/foo/bar/baz
> /home/user/foo/bar/baz       # edit this and hit return.  it runs cp for you

少なくともパスにスペースが含まれていない場合は、編集時にタブ補完を使用できます。残念ながら、これらは失敗したようです。

宛先ファイルが存在する場合は、宛先ファイルを上書きする前にメッセージが表示されます。

icpそしての(タイムスタンプのような属性)を含む、またはそれぞれimvに渡されるいくつかの基本的なオプションがあります。cpmvcp--no-preserve


または、ライン編集機能を使用すると、パスを非常に簡単かつ迅速にコピーできます。タイプ再び。

  • まずcp ~/mydir/subdir/タップ仕上げが可能です)

  • パスにスペースがない場合は、単一の ctrl-w を使用してそのパスを「終了」し、終了リングに保存します。空白がある場合は 1 つ以上が必要で oversize と kill を実行すると、cpCtrl-/ でサイズ超過をキャンセルしてもキリング項目の一部になります。

    または、ctrl-a、ctrl-右矢印を押してカーソルを後ろに置き、cpctrl-kを押して行の最後まで終了します。

  • コマンドラインが手順1に戻るようにCtrl-yを使用して終了した項目を元に戻しますが、ディレクトリは貼り付けることができます。

  • ソースファイル名(タップ仕上げが可能です)

  • スペースを押してからCtrl-y を使用してパスの別のコピーを作成します。。コマンドラインは次のようになります。
    cp ~/mydir/subdir/file1 ~/mydir/subdir/

  • 最終ファイル名(タップ仕上げが可能です)

同じビルディングブロックを異なる順序で使用することができる。たとえば、ファイル名を含むソースパスを入力するか、コピー/貼り付けを開始し、そのディレクトリにコピーを置く場合にのみ、ディレクトリを終了/プルする前に、Ctrl - 左矢印を押してカーソルを戻します。そのセクションを選択し、ctrl-e を押して行末を確認し、別のコピーを取り出します。

またはあなたが望むならコピーに似たファイル名を提供する、kill / 2xはフルパス(ファイル名を含む)をコピーし、2番目のコピー(ターゲット)を編集します。同様に、タブの完成もあらゆる段階で可能です。

誤って他のものを殺した場合、ctrl-yは間違ったものを取り出し、alt-yは古いキリング項目に戻ります。

これらのインタラクティブな行編集ツールは編集には役に立ちませんが、cp「単語」を押してカーソルを移動して前後に単語を削除することは、クイック編集とパスのコピーに最適です。

関連情報