ディレクトリを置き換えるのではなく、mvがディレクトリに移動することを決定する方法は?


18

ディレクトリがあるとしましょう/hello

それから私はmv /hello /hello2

私はに移動/helloしてい/hello2/helloますか?または私はに移動/helloしてい/hello2ますか?

このようなことをすると、一貫性のない結果が得られるようです。


1
どのような場合、結果に一貫性がありませんか?ターゲットディレクトリが存在する場合は常にターゲットディレクトリに移動し、そうでない場合は名前が変更されるようです。
jmathew

それは矛盾しています。同じコマンドで同じことを行う必要があります。つまり、コマンドはあいまいです。
user4951

コンテキスト内で一貫して動作するため、実際には一貫性がありません。どのように混乱するかはわかりますが、考えれば考えるほど、コマンドはすべてのシナリオで機能するためにそのようにならなければなりません。
-jmathew

私はむしろそれがどのように設計されていて、あなたが使用logical..ifそのも言うmvファイルにして、それは同じことがrenaming.but thing.justないmvディレクトリとそのサブディレクトリであるための1つのディレクトリ全体を削除するには良いではありませんmvではないコマンドを安全。のように移動されtest1/test2ます。それでも達成したい場合aliasは、指定されたパラメーターがディレクトリであるかどうかを確認し、ディレクトリをrm -rfしてmvコマンドを使用しますが、自己責任で使用してください。
harish.venkat

あなたの例は、「私はこのようなことをしているようです」に基づいて、過去に起こった何かを誤って思い出すことに基づいていると思います。との両方がディレクトリである場合、/helloそれ/hello2cp /hello /hello2矛盾していることに気付きました。末尾のスラッシュの組み合わせに応じて、の内容が/helloにコピーされる/hello2こともあれば、ディレクトリ自体がコピーされることもあります
。–イズカタ

回答:


16

mv a b移動しようとする試みaの中にbあればb、ディレクトリまたはディレクトリへのシンボリックリンクです。それ以外の場合は、名前を変更(またはコピーして別のファイルシステム上の場合は削除)されますab

一貫した結果を取得してファイルをディレクトリに移動するには、次のようにします。

mv file dir/

または

mv file dir/.

場合はdir存在しないと、エラーが発生しますよ、それは名前の変更はありませんfiledir

一方、renameGNU mvを使用して、宛先ファイルがディレクトリとして存在するかどうかを心配せずにaを実行する場合は、次の操作を実行できます。

mv -T file dest

その場合、ディレクトリの場合はfile移動されません。しかし、両方の場合とディレクトリであり、空である、に変更されます(と、元の削除)。両方がディレクトリで空ではない場合、文句を言います。destdestfiledestdestfiledestdestdestmv -T

同じで、ディレクトリfiledestない場合(およびディレクトリへのシンボリックリンクを含むシンボリックリンクを含む)は、file名前が変更されdest(ただし、書き込み権限がない場合はプロンプトが表示されますdest)、元のファイルdestは削除されます。がディレクトリへのシンボリックリンクmv file destである場合にdestは違いがあります。あり-Tfileに改名されますdestが、なしで-Tfileが指すディレクトリに移動されdestます。

まとめると、後にmv -T file destfile名前が変更されるdestか、エラーメッセージ(またはプロンプト)が表示されます。コマンドが成功した場合、元のdestが事前に存在していた場合は削除されます。


14

これは、「/ hello2」という名前のディレクトリがすでに存在しているかどうかに完全に依存しています。

/ hello2が存在し、ディレクトリである場合、moveは常に/ helloを/ hello / hello2に移動します

/ hello2が存在しない場合、moveは常に/ helloの名前を/ hello2に変更します

/ hello2が存在し、ファイルの場合、「ディレクトリ 'hello'で非ディレクトリ 'hello2'を上書きできません」というエラーが表示されます。


3

私はこれらを試しました

mkdir test1
mv -v test1 test2
output:`test1' -> `test2'
mkdir test1
mv -v test2 test1
output: `test2' -> `test1/test2'
touch test2
output:mv: cannot overwrite non-directory `test2' with directory `test1'

これがすべてを説明することを願っています。-v詳細モードです。

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