명시적인 대상 지정을 요구하도록 "mv"를 개선하시겠습니까?

명시적인 대상 지정을 요구하도록 "mv"를 개선하시겠습니까?

사용시 대상을 정확하게 지정하지 않아 오류가 발생했습니다 mv. 자세한 내용은 다음을 참조하세요.

mv이와 같은 인간의 실수로부터 더 안전 할 수 있을까요 ?

답변1

mv의 구문은 mvmv를 호출하는 거의 셀 수 없는 스크립트는 말할 것도 없고 수년에 걸쳐 관리자와 사용자의 마음 속에 각인되어 있으므로 사용자 인터페이스를 변경하면 많은 문제가 발생합니다. 명확한 목표가 필요한 래퍼(또는 완전히 새로운 도구)를 작성하는 것이 더 좋습니다.

답변2

이와 같은 오류에 대한 추가 보호를 추가하는 가장 일반적인 방법은 쉘 rc 파일(bash의 경우 ~/.bashrc)에 다음 세 가지 별칭을 추가하는 것입니다.

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'

관련 정보