mv -fのポイントは何ですか?


34

以下のためのGNUのCoreutilsマニュアルはmv言います:

-f --force Do not prompt the user before removing a destination file.

ただし、これはすでにのデフォルトの動作のmvようですので、この-fオプションは不要なようです。例えば、GNU Bashバージョン4.3.11の場合:

$ ls -l
total 0
$ touch 1 2; mv -f 1 2; ls
2
$ touch 1 2; mv 1 2; ls
2

-fフラグの意図がオーバーライドする可能性は低いようですalias mv="mv -i"。なぜなら、より簡潔に、コマンド間で一貫性のある方法でこれを行うエイリアスをオーバーライドする(たとえば、使用する)標準的な方法いくつかあるため\mvです。

マニュアルでは、「-i、-f、-nオプションのうち複数を指定すると、最後のオプションのみが有効になります」と書かれていますが、-fフラグの意図は-i一般的にフラグをオーバーライドすることではないようです。同等の挙動は、単に使用することによって達成することができるので、mvはるかに簡潔で使用するよりも分かりやすいがあります、mv -if

その場合、-fフラグの目的は何ですか?なぜ存在するのですか?


6
デフォルトは厄介なビジネスです。mountたとえば、などのツールを使用します(より良い例はありますが)。すべてのオプションのデフォルトが何であるかを覚えておく必要があるので、設定する必要があるオプションを決定できますか?デフォルトとデフォルト以外の両方のオプションがあるのは良いことです。そのため、デフォルトが何であるかを頭に入れずに、オプションを明示的に設定できます。何かがそこに何かよりも覚えやすいですありません
ワイルドカード

MVがmv-iに
アライズ

1
IMO、それはスクリプトでの使用にも適しています。なぜならあなたは明示的だからです。意図を少し良く伝えます。
ブラックライトシャイニング

回答:


41

の使用法は、4BSD -fmanページでより明確に説明されており、そこにオプション-f-iオプションが追加されました。

場合FILE2が既に存在する前に、それが削除されFILE1が移動されます。file2に書き込みを禁止するモードがある場合、mvはモードを出力し、標準入力を読み取って行を取得します。行がyで始まる場合、移動が行われます。そうでない場合、mvは終了します。

オプション:

-i対話モードを表します。移動が既存のファイルに優先する場合は常に、ファイルの名前の後に疑問符が表示されます。彼が「y」で始まる行で応答すると、移動が続行されます。その他の応答は、移動の発生を防ぎます。

-f力の略です。このオプションは、モード制限または-iスイッチをオーバーライドします。

mvの動作のより正確な定義は、POSIX標準で提供されて-fいます-i。これは、コマンドラインで後で発生した場合にのみオーバーライドを追加します。

そのため、デフォルトの動作はとは少し異なり-fます。デフォルトでは、ターゲットが書き込み可能でない場合にのみ確認を求めます。(この動作は、少なくとも限りさかのぼるV4mv任意のオプションをしていない。)場合は-iオプションが指定されたターゲットが存在するたびに、MVがさらに確認を求めます。-f(それは任意の後に発生した場合のオプションは、これらの例の両方に尋ねる阻害します-i)。


すばらしい答え、ありがとう!注:一部のファイルシステム(CIFSなど)では、-fフラグが使用されていなくても使用されているかのように動作するなど、mvが予期しない動作(つまり、マニュアルとは異なる)を示す場合があります
サンパブロクパー

多くの実装は、対話型端末(isatty(0))にあるように見える場合にのみ確認を要求することに注意してください。また、後で-fオーバーライドするのは事実ですが、-iこれは引数が与えられないのと同じことを意味しないかもしれません。
phk

15

の実行をmv正常なデフォルトに設定した場合に役立ちます。

alias mv="mv -i"

その後、強制的に移動したい場合、これは動作します:

mv -f

カウントされるのは、展開されたコマンドの最後のオプションであるためです。

mv -i -f

この点は、GNU Coreutilsマニュアルにも記載されています


1
感謝しますalias mv="mv -i"が、質問に追加した理由により、オーバーライドがの存在理由である可能性は低いようです-f
サンパブロクパー

12
私は、あなたがmv(1)暗示するように、「そして、他のUnixコマンド」の「正気でない」振る舞いを「あなたが尋ねられたとおりに、愚かな質問なし」と呼ぶことに反対します
...-vonbrand

1
vonbrandは、Linux / UNIXコマンドの直接の応答を感謝して-iいますが、コマンドラインを数年以上使用しているmv人は、ある時点でに焼かれていると思います。
アレクサンダー

1
-iをオーバーライドすることはまずないと思うかもしれませんが、だからこそ-fがそのように使用されると思います。
ウォルター

11

存在するのは(man mv

あなたは以上のいずれかを指定した場合-i-f-n、唯一の最後の一つが有効になります。

そのため、常に要求するスクリプト/エイリアス/関数を使用できますが、オプションをオーバーライドできます。

# alias
alias mv='mv -i'

# function
MV () { mv -i "$@" ; }

# script
#!/bin/bash
mv -i "$@"

意味のある関数/スクリプトは、もちろん、もっと何かをします(アクションを記録するなど)


@chorobaありがとう、しかし今質問に追加しalias mv="mv -i"た理由のために、のようなエイリアスのオーバーライドがの存在の理由である可能性は低いようです-f。ただし、スクリプトと関数についても言及します。これら2つを使用して例を挙げていただけますか?
サンパブロクパー

@sampablokuper:更新されました。
チョロバ

@チョロバ、ありがとう。残念なことに、関数の例もスクリプトの例もを使用mv -fしていないため、その存在を正当化/説明する方法はまだわかりません。明らかなことを見逃している場合は申し訳ありません!
サンパブロクパー

@sampablokuper:それらはすべてを使用しますmv -i。それらを使用したいが、インタラクションをスキップしたい場合MV -fなどに使用します。
choroba15年

1
行動@sampablokuper mvこれらのオプションのいずれかのないことです時々尋ねる(ターゲットでない書き込みおよび対話型端末を)ので、これは間に明確な違いだろうmv -f\mv
phk

5

mv異なる独自の缶機能のコマンド-fオプション、それはプロンプトなしで上書き書き込み保護されたファイルにしようとすることに。

user2@host:location> ls -l ./
drwxrwxr-x 2 user1 users    10   Oct 16 12:58 dir
user2@host:location> ls -l ./dir/
-rw-r--r-- 2 user1 users     0   Oct 16 12:58 file1
-rw-r--r-- 2 user2 users     0   Oct 16 12:58 file2
user2@host:location> \mv ./dir/file2 ./dir/file1
'mv' try to overwrite './dir/file1', overridding mode 0644 (rw-r--r--)? n
user2@host:location> \mv -f ./dir/file2 ./dir/file1
user2@host:location> ls -l ./dir/
-rw-r--r-- 2 user2 users     0   Oct 16 12:58 file1

ディレクトリの書き込み権限により、user2はのuser1ファイルを上書きできますが、上書きする./dir/前に警告が表示されます。-f警告を防ぎます。


-1

シェルプログラミングでは、-fを使用することは、コマンドがエラーで中断したり、特定のコマンドを実行するときにスクリプト/ユーザーにインタラクティブな応答を求めたりしないようにするための一般的なイディオムです。最後にしたいことは、スクリプトがユーザーの入力を待つのを一時停止することです。さらに悪いことに、間違ったコマンドが標準入力から入力を取得することもあります。

注:エイリアスを元に戻すと、副作用が発生/削除される可能性があります。コマンドを別のバージョンまたは追加オプションでエイリアス化した場合、エイリアスを元に戻すと、望ましくない副作用が発生します。たとえば、リサイクル缶(または他の保護/追跡システム)を使用するために、mvおよびrmを使用してエイリアスをセットアップする場合があります。エイリアスを元に戻すとこれが壊れます...


Nitpick:-fcpまたはmv のオプションは、「それらが機能する」ことを保証しません。たとえば、許可が不十分な場合、-fコマンドは許可を機能させません。つまり、-fはプロンプトなしで上書きを強制します。反対のフラグ-iは、上書き時にインタラクティブを要求することを意味します。
エリックレシンスキー

注意すべき2つの点:1.)実装は通常、対話型端末(isatty(0))にいるかどうかをテストします。たとえば、スクリプトがパイプの一部として実行されても、トリガーされません。2.)追加-fは元に戻す-iことmv -i -fとは異なりますマークの答えをmv参照してください。
phk
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.