web-dev-qa-db-ja.com

'mv'はドラッグアンドドロップに相当しますか?

GUI環境では、置換を伴うドラッグアンドドロップにより、ファイルおよびディレクトリ全体(内容を含む)がコピーされたもので置き換えられます。'mv 'コマンドでこれと同じ直感的な結果を実現する方法はありますか?

19
user7089

mvではありません。

mvのコア関数(その名前にもかかわらず)はrenameオブジェクトです。 UNIXが行う保証の1つは、名前の変更がアトミックであることです。部分的に完了した名前の変更を確認することはできません。この保証は、他のプログラムが参照している可能性のあるファイル(たとえば、/etc/passwd)を変更したい場合や、ファイルの古いバージョンまたは新しいバージョンを表示したい場合に非常に役立ちます他の可能性はありません。しかし、あなたが説明するような「再帰的な名前変更」はその保証を破るでしょう-あなたはそれを途中で止めることができ、あなたは半分移動したツリーとおそらく混乱を持っているでしょう-そしてそれはそれで哲学に本当に適合しません/ mvmv -rが存在しない理由は、これが私の推測です。

mvは他の小さな方法でその哲学を破ることを気にしないでください。たとえば、mvは実際にcpの後にrmを実行してからファイルを移動します別のファイルシステムへ)。

十分な哲学。ツリーをある場所から別の場所に再帰的に移動(「ドラッグアンドドロップ」)したい場合同じファイルシステム上の場合、次のようにmvの効率と速度を得ることができます(例):

cp -al source/* dest/ && rm -r source/*

cp-lフラグは、「コピーする代わりにハードリンクを作成する」ことを意味します。つまり、古いファイル名と同じファイルデータを指す新しいファイル名を効果的に作成します。ただし、これはハードリンクをサポートするファイルシステムでのみ機能します。つまり、ネイティブUNIX風のファイルシステムは問題ありませんが、FATでは機能しません。

&&は、「前のコマンドが成功した場合にのみ次のコマンドを実行する」ことを意味します。必要に応じて、代わりに2つのコマンドを1つずつ実行できます。

20
Jander

ターゲットの空ではないサブディレクトリは置き換えられないため、mvを使用して説明しているドラッグドロップ動作を再現できないと思います。

たぶんrsyncrsync -a -r source/ target/のようなもの? -v -nを使用して実行し、最初に詳細な予行演習を行って、期待どおりに機能することを確認します。

4
cjc

mv -f /path/to/source/folder/* /destination/folder/

ファイルとディレクトリを含む/ path/to/source/folder内のすべてを/ destination/folderに移動します。

そして、既存のファイルとディレクトリを上書きします。

3
Tim

あなたはおそらくこれに対する正しい答えを変更したいと思うでしょう:

https://github.com/iaindooley/pickdrop

例:

私が持っていると言う:

test/
test/index.php
test/images/
test/images/a.jpg
test/images/thing.png

これらを/ siteに移動したい

だからそれは次のようになります:

site/
site/public/
site/public/index.php
site/public/a.jpg
site/public/thing.png

私は行くことができます:

cd images &&
pick a.jpg thing.png
cd .. &&
pick index.php &&
cd .. &&
mkdir site &&
mkdir site/public &&
cd site/public &&
drop

これは文字通りカットアンドペーストです。

1
tester