사용시 대상을 정확하게 지정하지 않아 오류가 발생했습니다 mv
. 자세한 내용은 다음을 참조하세요.
mv
이와 같은 인간의 실수로부터 더 안전 할 수 있을까요 ?
답변1
mv의 구문은 mv
mv를 호출하는 거의 셀 수 없는 스크립트는 말할 것도 없고 수년에 걸쳐 관리자와 사용자의 마음 속에 각인되어 있으므로 사용자 인터페이스를 변경하면 많은 문제가 발생합니다. 명확한 목표가 필요한 래퍼(또는 완전히 새로운 도구)를 작성하는 것이 더 좋습니다.
답변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'