web-dev-qa-db-ja.com

`mv file / dir`がファイルを現在の作業ディレクトリのサブディレクトリに移動しないのはなぜですか?

私は/etcディレクトリにいて、コマンドを入力しました

me@mylaptop:/etc$ Sudo mv MyFile.conf /openvpn

ファイルを/etcディレクトリのサブディレクトリであるopenvpnディレクトリに移動すると思いました。しかし、それは起こったことではないようです。確認できるのは、コマンドが実行されたことだけです。

10
whitelightning

この名前のディレクトリが存在しない場合、ファイルの名前をルートディレクトリ/にあるopenvpnに変更しました。これを元に戻すには、次のコマンドを実行します。

Sudo mv /openvpn /etc/MyFile.conf

ディレクトリが存在した場合、その中にファイルを移動すると、復帰は次のようになります。

Sudo mv /openvpn/MyFile.conf /etc/

現在のディレクトリの既存のサブディレクトリに移動するには、次のいずれかを実行できます。これらはrelativeパスを使用します。

mv MyFile.conf openvpn
mv MyFile.conf openvpn/
mv MyFile.conf ./openvpn
mv MyFile.conf ./openvpn/

.は現在のディレクトリへのリンクなので、パスの先頭の./は「このディレクトリ内」を意味します。末尾のスラッシュは、openvpnがディレクトリであり、その中にファイルを移動することを意味します。指定しない場合、この名前のディレクトリが存在する場合、ファイルはmovedになります。それ以外の場合、ファイルはnamedopenvpnに変更します。最後に/を付けると、mvはディレクトリが見つからない場合に警告し、not名前を変更するので、名前を変更したくない場合の安全な方法。

一方、パスが/で始まる場合は、現在の作業ディレクトリに関係なく、absoluteパスであり、常にルートディレクトリからの相対パスです。 /。ファイルと宛先の両方に絶対パスを使用すると、コマンドは次のようになります。

mv /etc/MyFile.conf /etc/openvpn
mv /etc/MyFile.conf /etc/openvpn/

参考文献

51
dessert

使用する必要があります

me@mylaptop:/etc$ Sudo mv MyFile.conf openvpn/

MyFile.confファイルを/etc/openvpnサブディレクトリに移動します。

一方

me@mylaptop:/etc$ Sudo mv MyFile.conf /openvpn

代わりに、ファイルを/ディレクトリにopenvpnとして移動します(つまり、openvpnに名前を変更します)(/openvpnディレクトリが存在しない場合)。

9
pomsky

ファイルを移動するときは、ファイルを入れたいディレクトリ、またはファイルに与えたい新しいパスをOSに指示します。

OSに「/ openvpn」と伝えました。だからそれは正確にそれをするつもりです-/ openvpnが存在するかどうかを確認します(ルートディレクトリにある「openvpn」と呼ばれるオブジェクトを意味します)そしてディレクトリです、ファイルを移動する場合、または/ openvpnがファイルであるか存在しない場合は、ファイルの名前を変更して移動し、/ openvpnとしてアクセスできるようにします。

あなたがそれをしたかったのは、それを現在のディレクトリにある「openvpn」ディレクトリ内に移動することでした。ファイルシステムのルートディレクトリにあるものではありません(先頭の「/"は意味します)。したがって、絶対パス "/ openvpn"ではなく、移動コマンドでthat dirを指す必要がありました。これらのいずれでも機能します。

  • mv MyFile.conf openvpn-現在のディレクトリでこの「openvpn」を探します
  • mv MyFile.conf /etc/openvpn-絶対パス/ etc/openvpnを探します
  • mv MyFile.conf openvpn/-現在のディレクトリでopenvpnというディレクトリを探します
  • mv MyFile.conf ./openvpn-「現在のディレクトリ」をさらに明確にする

短いバージョン-「/」は「私の現在のディレクトリ」を意味するために使用したので、「/ openvpn」は「現在のディレクトリにあるopenvpn」を意味します。ただし、先頭の「/」は常に「ルートディレクトリ」を意味するだけなので、「/ openvpn」は「ルートディレクトリのopenvpn」を意味します。必要なのは、単に「openvpn」または「openvpn /」を使用することでした。つまり、「openvpn in my current directory "。

4
Stilez

_/_で始まるパスは絶対パスであり、相対パスではありません。

すべてのパスが常に現在のディレクトリからの相対パスである場合、最初にどのように_cd /etc_を使用しますか? _cd ../../../../../etc_で_.._のレベルが十分であることを期待するか、ルートディレクトリに到達するまで_cd .._を実行し続ける必要があります。

または、絶対パスを表現する他の構文が必要です。しかし、Unixは_/_が絶対を意味することを決定しました。したがって、_mv MyFile.txt openvpn_は機能します。


そして、いいえ、存在するかどうかに関係なく、絶対か相対かを推測するのはうまくいきません。 mkdirシステムコールがchdirまたはrenameシステムコールとは異なる方法でパスを処理することは望ましくありません。また、mvプログラムにそれを実行させると、mvと、出力ファイル名を取得する他のプログラムとの間の不整合の余地が残ります。

mvはすでに特別です。これは、rename()宛先がディレクトリの場合、ソースファイル名をその宛先ディレクトリに追加して再試行するためです。ただし、1つの単純な実装戦略は、最初のrename()システムコールがEEXISTまたはEISDIRで失敗することに依存していることに注意してください。したがって、ファイルシステムをチェックする前に、パスが相対パスか絶対パスかを知る必要があります。

(初期のUnixは低速のコンピューターで実行され、ディレクトリが存在するかどうかの追加のチェックは、それがキャッシュされていない場合は追加のI/Oを意味する可能性がありました。または、ディレクトリキャッシュへの圧力が高まっています。しかし、最初の推測の理由を説明するには、正気度/正しさの引数で十分だと思います歴史的な効率の議論に頼らずにシステムが機能するもっともらしい方法ではありませんでした。)

1
Peter Cordes

他の回答を完了するには:

mv file.txt /location

windowsの場合と同じ

mv file.txt c:\location

Linuxのfilesystemは、filesystem階層標準に従って考えられています。または [〜#〜] fhs [〜#〜] 略して。これは、ファイルの性質と内容に応じて、ファイルを配置する場所を知るのに役立ちます。

最初のフォルダー(Windowsのc:に相当)は/です。