심볼릭 링크가 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는 완료가 끝나면 후행 슬래시를 제거합니다. 완성에 슬래시를 추가하므로 ba
Tab결과는 이지만 bar/
, 누르 Space거나 커서 또는 삽입 내용을 제외한 대부분의 항목을 이동하면 zsh가 을 제거합니다 /
. ( /
강조 표시는 "고통"을 의미합니다.)
슬래시를 사용하여 명령을 입력하게 되면 mv bar/ baz
디렉터리 이름을 바꾸는 것이 foo
예상되는 동작입니다. bar/
슬래시로 끝나기 때문에 경로 이름 구문 분석은 이를 foo
.
이 동작을 피하려면 mv
zsh의 경우 테스트되지 않아야 합니다.
function mv {
local i
for ((i=1; i < $#; i++)); do
if [[ $argv[$i] == *[^/]*/ ]]; then
argv[$i]=${argv[i]%/}
fi
done
command mv "$@"
}
이 함수는 다소 순진하다는 점에 유의하십시오. 예를 들어 대상을 제거해서는 안 되는 매개변수로 이해 -t
하거나 취하지 않습니다 .--target