파일 경로가 있다고 가정할 때 명령줄에서 해당 파일의 디렉터리를 어떻게 참조합니까?

파일 경로가 있다고 가정할 때 명령줄에서 해당 파일의 디렉터리를 어떻게 참조합니까?

다음을 입력할 수 있습니다.

dirname ~/home/blah/file.zip

예를 들어, 이것은 그 자체로는 잘 작동하지만 이 구문을 일부 명령에 대한 인수로 사용하면 항상 "dirname"을 원하는 디렉터리로 읽습니다. 즉:

cd dirname ~/home/blah/file.zip
bash: cd: dirname: No such file or directory

기본적으로 'dirname'은 어떻게 얻나요?문서'를 엔터티로 해석하나요?

답변1

cd "$(dirname ~/home/blah/file.zip)"

$(명령 대체의 한 형태입니다. 이것배쉬 가이드 위키이 과정에 대한 좋은 정보가 있습니다.

답변2

(다른 답변에 이미 표시된 명령 대체 기능을 반복하지 않겠습니다.)

이런 일이 자주 발생하는 경우 함수를 정의할 수 있습니다. 예를 들어 다음을 다음과 같이 입력하세요 ~/.bashrc.

d () {
  if ! [ -d "$1/." ]; then
    set -- "${1%/*}"
  fi
  cd -- "$1"
}

d /path/to/directory이 정의를 사용하면 지정된 디렉터리로 변경을 실행하거나 d /path/to/file지정된 파일(예 /path/to: .

이 특정 명령의 경우 명령을 편집하여 마지막 단어를 삭제할 수 있습니다. 기본 키 바인딩을 사용하여 줄 끝에서 시작하여 Alt+를 눌러 B이전 단어로 돌아가고 Alt+를 눌러 D오른쪽에 있는 단어를 삭제합니다. 대부분의 터미널에서는 줄 끝에서 시작하여 를 Esc Backspace눌러 바로 왼쪽에 있는 단어를 삭제할 수 있습니다.

path가 디렉토리인 경우 ~/home/blah/subdir/..와 동일한 디렉토리를 지정하십시오 ~/home/blah.

zsh에서는 (:h)경로 끝에 태그를 추가하여 파일 이름을 제거하고 디렉터리 부분만 유지할 수 있습니다. ( h"head"에 대해 작동하며 t"tail"은 파일 부분만 유지합니다.) 다른 것을 사용할 수 있습니다.역사적 수정(:…)경로나 글로브 뒤에 .

cd ~/home/blah/file.zip(:h)

답변3

Chris가 권장하는 양식이 "$(cmd)"가장 안전하지만 이 양식이 입력하기 더 쉽고 일반적으로 잘 작동합니다.

$ cd `dirname ~/home/blah/file.zip`

차이점은 백틱 형식에 있습니다.혼란스러울 수도 있다명령의 특정 문자에 따라 확장됩니다. 표시된 것과 같은 간단한 명령의 경우 이것이 문제가 되지 않는다는 것을 즉시 알 수 있습니다. 임의의 매개변수를 허용해야 하는 쉘 스크립트의 경우 $()큰따옴표를 사용하는 것이 더 안전합니다.

답변4

(댓글을 달기에는 너무 커서 @gilles의 답변에 대한 답변입니다.)

Giles가 이미 지적했듯이 필요한 기능을 자동으로 수행하는 함수를 만들 수 있습니다. 그러나 이를 재정의하고 대신 임의의 이름을 사용할 수도 있습니다 cd.

zsh의 경우:

cd() {
    if (( ${#argv} == 1 )) && [[ -f ${1} ]]; then
        builtin cd ${1:h}
    else
        builtin cd "$@"
    fi
}

배쉬의 경우:

cd() {
    if [ $# == 1 ] && [[ -f ${1} ]]; then
        builtin cd "$(dirname ${1})"
    else
        builtin cd "$@"
    fi
}

cd /path/to/file이렇게 하면 디렉토리를 특정 파일로 자동으로 변경하는 다음 과 같은 작업을 수행할 수 있습니다 . 물론 zsh와 함께 bash 버전을 사용할 수도 있습니다.

관련 정보