デフォルトの動作がすでにファイルをオーバーライドしている場合、mv -fのポイントは何ですか?

デフォルトの動作がすでにファイルをオーバーライドしている場合、mv -fのポイントは何ですか?

これ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同等の動作を達成します。mvmv -if

それでは、-f旗の目的は何ですか?なぜ存在するのですか?

答え1

の使用法は、以下の-f項目でより明確に説明されています。マニュアルページ-f4BSD以降とオプションが追加されました-i

もしファイル2すでに存在し、以前に削除されました。ファイル1触れた。もしファイル2書き込み禁止モードがあります。 mvはモードを印刷し、標準入力を読み取って行を取得します。行がyで始まると移動が発生し、そうでなければmvは終了します。

オプション:

-i対話型モードを示します。移動によって既存のファイルが置き換えられるたびに、ユーザーにファイル名の入力を求められ、その後に疑問符が表示されます。彼が「y」で始まる行に応答すると、移動は続行されます。別の回答をすると移動は発生しません。

-f力を表します。このオプションは、すべてのモード制限または-iスイッチを無視します。

mvの仕組みのより正確な定義は次のとおりです。POSIX規格-f後でコマンドラインに表示される場合にのみ上書きされます。-i

したがって、デフォルトの動作は同じです-f。デフォルトでは、宛先に書き込めない場合にのみ確認が要求されます。 (この動作は少なくともV4mvオプションは使用されません。 )-iオプションが与えられると、mv はターゲットが存在する限り追加の確認を要求します。この-fオプションは両方の場合で要求を無効にします(すべての後に発生する場合-i)。

答え2

mv合理的なデフォルト値で実行を設定する場合に便利です。

alias mv="mv -i"

強制的に移動したい場合に動作します。

mv -f

これは拡張コマンドの最後のオプションだからです。

mv -i -f

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

答え3

man mv()のために存在する。

-i-f、、、を複数指定すると、最後の項目-nのみが適用されます。

したがって、常に要求されるスクリプト/エイリアス/関数を持つことはできますが、まだオプションをオーバーライドできます。

# alias
alias mv='mv -i'

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

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

もちろん、意味のある関数/スクリプトは、ログ操作などのより多くのタスクを実行します。

答え4

シェルプログラミングで-fを使用することは、コマンドがエラーのために中断したり、特定のコマンドを実行したときにスクリプト/ユーザーの対話型応答を必要としないようにするための一般的なイディオムです。最後に望むのは、スクリプトがユーザー入力を待つのを止めることです。さらに悪いことは、誤ったコマンドが標準入力から入力を受け取ることです。

メモ:エイリアスを元に戻すと、副作用が発生/削除される可能性があります。コマンドに別のバージョンのエイリアスを指定した場合、または別のオプションを使用した場合は、エイリアスを元に戻すと不要な副作用が発生する可能性があります。たとえば、リサイクルjar(または他の保護/追跡システム)を使用するためのエイリアス設定にmvとrmを使用できます。エイリアスをキャンセルすると、この問題が発生します。

関連情報