디렉토리를 생성하고 동시에 디렉토리로 이동할 수 있는 한 줄의 코드가 있습니까?

디렉토리를 생성하고 동시에 디렉토리로 이동할 수 있는 한 줄의 코드가 있습니까?

나는 이것을 많이 반복하고 있습니다.

mkdir longtitleproject
cd longtitleproject

디렉토리 이름을 반복하지 않고 한 줄로 수행할 수 있는 방법이 있습니까? 나는 여기서 파티를 하고 있다.

답변1

이것이 당신에게 필요한 단일 라이너입니다. 추가 구성이 필요하지 않습니다.

mkdir longtitleproject && cd $_

Bash에서 변수는 $_이전 명령에 제공된 마지막 인수입니다. 이 경우 방금 생성한 디렉터리의 이름입니다. 설명된 대로 man bash:

_         At  shell  startup,  set to the absolute pathname used to invoke
          the shell or shell script being executed as passed in the  envi‐
          ronment  or  argument  list.   Subsequently, expands to the last
          argument to the previous command, after expansion.  Also set  to
          the  full  pathname  used  to  invoke  each command executed and
          placed in the environment exported to that command.  When check‐
          ing  mail,  this  parameter holds the name of the mail file cur‐
          rently being checked."$_" is the last argument of the previous command.

cd $_이전 명령의 마지막 인수가 제공되었기 cd !$때문에 가 아니라 cd !$이전 명령의 마지막 인수를 검색하는 데 사용됩니다.쉘 역사에서:

cd ~/
mkdir folder && cd !$

드디어 집에 도착했어요 (혹은 ~/)

cd ~/
mkdir newfolder && cd $_

집 아래에 새 폴더가 생성됩니다! (또는 ~/newfolder )

답변2

내장된 명령은 없지만 mkdirthen을 호출하는 함수를 쉽게 작성할 수 있습니다 cd.

mkcd () {
  mkdir "$1"
  cd "$1"
}

이 코드를 ~/.bashrc파일에 넣으세요( ~/.kshrcksh 사용자 또는 ~/.zshrczsh 사용자의 경우). 이라는 함수를 정의합니다 mkcd. "$1"함수를 실행하면 함수의 인수로 대체됩니다.

이 간단한 버전에는 몇 가지 결함이 있습니다.

  • 일련의 하위 디렉터리를 한 번에 생성할 수 없습니다. 수정 : -p옵션을 .mkdirmkcd mydierctory/newsubmydierctorymydierctory/newsubnewsubmydirectory
  • 인수가 -but 으로 시작 -하면 mkdirand 는 cd이를 옵션으로 해석합니다. 그렇다면 -그것은 cd의미로 해석될 것이다 $OLDPWD. +뒤에 0개 이상의 숫자가 오면 zsh cd는 이를 디렉토리 스택에 대한 인덱스로 해석합니다. --인수 앞에 전달 하면 첫 번째 문제는 해결되지만 나머지 두 문제는 해결되지 않습니다. ./상대 경로인 경우 매개변수를 앞에 추가하면 이러한 모든 문제를 해결할 수 있습니다.
  • mkdirNot Follow CDPATH, 그러나 따라가기 때문에 시작 하지 않는 값 (다소 특이한 구성) 을 cd설정하면 방금 생성한 디렉터리와 다른 디렉터리로 이동될 수 있습니다. 상대 경로 앞에 접두사를 붙이면 이 문제가 해결됩니다( 무시됩니다).CDPATH.cd./CDPATH
  • mkdir실패 하면 실행을 시도합니다 cd. 수정: &&두 명령을 분리하는 데 사용됩니다.

여전히 매우 간단합니다.

mkcd () {
  case "$1" in /*) :;; *) set -- "./$1";; esac
  mkdir -p "$1" && cd "$1"
}

이 버전을 사용하면 go 에 대한 인수가 심볼릭 링크를 포함 하고 전달하는 경우와 같은 극단적인 경우에 방금 생성된 디렉터리와 다른 디렉터리 cd로 이동하는 것이 여전히 가능합니다 . 예를 들어, 현재 디렉토리가 에 대한 심볼릭 링크이고 이면 ( 즉 ) 에 대한 변경을 생성 합니다 . 쉘이 현재 디렉토리의 심볼릭 링크도 추적하므로 인수에서 심볼릭 링크를 찾는 것만으로는 충분하지 않습니다. 따라서 새 디렉토리( )로 변경하는 대신 이 문제를 해결하는 방법은 내장 함수가 모든 경로를 먼저 확인하도록 하는 것 입니다. 구성 요소( 존재하지 않는 경우 사용하는 것은 의미가 없으므로 경로 구성 요소를 볼 필요가 없습니다).mkdirmkcd../tmp/heremylink/somewhere/elsemkdir mylink/../foo/somewhere/foocd mylink/../foofoo/tmp/here/foocd /tmp/mylink; mkdir ../foo; cd ../foo/somewhere/else/foo/tmp/foocd..foo/..foomkdir..

우리는 강력하지만 약간 피비린내 나는 버전에 이르렀습니다.

mkcd () {
  case "$1" in
    */..|*/../) cd -- "$1";; # that doesn't make any sense unless the directory already exists
    /*/../*) (cd "${1%/../*}/.." && mkdir -p "./${1##*/../}") && cd -- "$1";;
    /*) mkdir -p "$1" && cd "$1";;
    */../*) (cd "./${1%/../*}/.." && mkdir -p "./${1##*/../}") && cd "./$1";;
    ../*) (cd .. && mkdir -p "${1#.}") && cd "$1";;
    *) mkdir -p "./$1" && cd "./$1";;
  esac
}

(연습: 첫 번째 호출에서 서브셸을 사용하는 이유는 무엇입니까 cd?)

mkdir이 실패하면 현재 디렉터리가 변경되지 않았는지 확인하고 싶습니다. 쉘에 현재 디렉토리로 변경할 권한이 없으면 cd - 또는 $OLDPWD를 사용하여 다시 변경하는 것만으로는 충분하지 않습니다. 또한 cd를 호출하면 OLDPWD가 업데이트되므로 한 번만 수행하거나 OLDPWD를 복원하려고 합니다.


이전 줄의 단어를 다시 입력하지 않아도 되는 덜 기술적인 방법도 있습니다.

  • cdthen Esc .(또는 Alt+ ) 를 입력하여 .이전 명령의 마지막 인수를 삽입합니다.
  • cd !$cd이전 명령의 마지막 인수에서 실행됩니다.
  • 를 눌러 Up이전 명령줄을 불러온 다음 편집하여 mkdir로 변경합니다 cd.

하지만 참고하세요u+해당 버전 이후 ksh93에서는 작동하지 않습니다., 93u+m/1.0.0-alpha+d1483150 2021-01-05에서 수정됨

답변3

Oh My Zsh를 사용하면 다음과 같은 명령어가 있습니다.가져가다그것이 바로 그것이 하는 일입니다. 이렇게 생겼습니다.

take myfolder

사실 저는 이것을 우연히 발견했습니다. 방금 봤는데 목록에 나와있어요이건 부정행위야Oh My Zsh GitHub 위키에서. 이것은 매우 유용한 명령이며 분명히 직접 생성하기 쉽습니다.

답변4

~에 따르면생산성을 향상시키기 위해 쉘 구성 파일에 어떤 사용자 정의를 적용했습니까?, 이것이 제가 하는 방법입니다:

# make a directory and cd to it
mcd()
{
    test -d "$1" || mkdir "$1" && cd "$1"
}

이는 디렉토리가 이미 존재하는 경우에도 작동한다는 것을 의미합니다.

관련 정보