mv가 대상 폴더를 이동하지 못하도록 방지

mv가 대상 폴더를 이동하지 못하도록 방지

심볼릭 링크가 bar폴더를 가리키는 경우 foo다음 두 명령의 동작은 매우 다릅니다 .

mv bar  baz   # rename link 'bar' to 'baz'
mv bar/ baz   # rename folder 'foo' to 'baz'

(OSX에서 bash 3.2 및 zsh 5.7.1을 시도했습니다).

나는 두 번째 동작이 매우 위험하다고 생각하며(특히 "탭"이 폴더 이름 뒤에 슬래시를 포함하는 경우가 많다는 점을 고려하면) 가능하면 이를 방지하고 싶습니다. 설명서에는 mv이 옵션이 없는 것 같습니다. mv내 함수에 대한 별칭이 누락되었으므로 이 문제를 해결하는 데 도움이 될 수 있는 Bash 옵션이나 zsh 옵션 또는 다른 것이 있습니까 ?

답변1

zsh에서는 그렇게 하지 않는 한unsetopt auto_remove_slash, zsh는 완료가 끝나면 후행 슬래시를 제거합니다. 완성에 슬래시를 추가하므로 baTab결과는 이지만 bar/, 누르 Space거나 커서 또는 삽입 내용을 제외한 대부분의 항목을 이동하면 zsh가 을 제거합니다 /. ( /강조 표시는 "고통"을 의미합니다.)

슬래시를 사용하여 명령을 입력하게 되면 mv bar/ baz디렉터리 이름을 바꾸는 것이 foo예상되는 동작입니다. bar/슬래시로 끝나기 때문에 경로 이름 구문 분석은 이를 foo.

이 동작을 피하려면 mvzsh의 경우 테스트되지 않아야 합니다.

function mv {
  local i
  for ((i=1; i < $#; i++)); do
    if [[ $argv[$i] == *[^/]*/ ]]; then
      argv[$i]=${argv[i]%/}
    fi
  done
  command mv "$@"
}

이 함수는 다소 순진하다는 점에 유의하십시오. 예를 들어 대상을 제거해서는 안 되는 매개변수로 이해 -t하거나 취하지 않습니다 .--target

관련 정보