明示的なターゲット指定を要求するように「mv」を改善しますか?

明示的なターゲット指定を要求するように「mv」を改善しますか?

使用時にターゲットを正しく指定しなかったため、エラーが発生しましたmv。詳細については、次を参照してください。

mvこのような人間の間違いからより安全になりますか?

答え1

mvの構文は、mvmvを呼び出すほとんど数えられないスクリプトは言うまでもなく、長年にわたって管理者とユーザーの心の中に刻印されているため、ユーザーインターフェイスを変更すると多くの問題が発生します。明確な目標を必要とするラッパー(またはまったく新しいツール)を作成することをお勧めします。

答え2

このようなエラーに対する追加の保護を追加する最も一般的な方法は、シェルのrcファイル(bashの場合は〜/ .bashrc)に次の3つのエイリアスを追加することです。

alias cp="cp -i"
alias mv="mv -i"
alias rm="rm -i"

この-iスイッチは対話型を表し、ファイルを上書きまたは削除する前にメッセージを表示します。

rmこれには別の適応があります。

-I                    prompt once before removing more than three files, or
                      when removing recursively.  Less intrusive than -i,
                      while still giving protection against most mistakes

答え3

このコマンドは、その引数を構成するためにどのワイルドカード文字が拡張されたかを知る方法はありません。

zshでは追加できますnoglobワイルドカード拡張を防ぐために、コマンドの前の修飾子です。これにより、最後のパラメータにワイルドカードが含まれている場合に呼び出しを拒否するラッパーを定義できます。

mv_check_last_argument () {
  local last
  setopt local_options null_glob
  last=(${~${(P)#}})
  if [[ $#last -eq 1 && $last[1] = ${(P)#} ]]; then
    command mv $~@[@]
  else
    echo 1>&2 "Not running mv because '${(P)#}' is a wildcard pattern"
    return 125
  fi
}
alias mv='noglob mv_check_last_argument'

(警告:テストされていないコード)

もちろん、これは単一のターゲットディレクトリと一致させたい場合はワイルドカードを使用する機能を削除しますが、代わりに完成機能を使用できるため、通常はあまり役に立ちません。ワイルドカードを実際に使用するには、\mv …バックスラッシュと一緒に使用してエイリアスを抑制します。

mv既存のターゲットファイルを上書きしないと、エラーは簡単にキャンセルされます。ターゲットファイルを上書きするのを防ぐには、mv -i代わりに実行する簡単な方法がありますmv。この方法では、mvファイル移動操作のみを実行し、ファイル削除という追加の操作を実行する必要があるかどうかを尋ねるメッセージが表示されます。繰り返しますが、スキップエイリアスを使用し\mv …、ターゲットがすでに存在する場合は無条件に上書きします。

alias cp='cp -i' mv='mv -i'

関連情報