디렉토리를 작성하고 동시에 디렉토리로 이동할 수있는 단일 라이너가 있습니까?


150

나는 많은 것을 반복하는 것을 발견했다.

mkdir longtitleproject
cd longtitleproject

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




1
mkdir longtitleprojectthencd !^
user262826

답변:


160

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

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

이 코드를 ~/.bashrc파일 (또는 ~/.kshrcksh 사용자 또는 ~/.zshrczsh 사용자)에 넣으십시오 . 라는 함수를 정의합니다 mkcd. "$1"함수를 실행할 때 함수의 인수로 대체됩니다.

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

  • 하위 디렉토리 체인을 한 번에 만들 수 없습니다. 수정 : -p옵션을로 전달하십시오 mkdir. (이 발견되지 않은가는 오타의 위험, 예를 들어이 증가 이것은 또는 바람직하지 않을 수있다 mkcd mydierctory/newsub행복하게 만듭니다을 mydierctory하고 mydierctory/newsub생성을 의미 할 때 newsub기존의 내부 mydirectory.)
  • 인수가로 시작하는 경우 -그러나 다만 아니다 -, 다음 mkdircd옵션으로 해석합니다. 그냥 -이면 cd의미로 해석합니다 $OLDPWD. +그 뒤에 0 자리 이상의 숫자 가 오는 경우 cdzsh에서는 디렉토리 스택의 인덱스로 해석합니다. --인수 앞에 전달하여 첫 번째 문제는 해결할 수 있지만 다른 문제는 해결할 수 없습니다 . ./상대 경로 인 경우 인수 앞에 추가 하여 이러한 모든 문제를 해결할 수 있습니다 .
  • mkdir을 따르지 CDPATH않지만 cd, 따라서 CDPATH시작하지 않는 값으로 설정 한 경우 .(어쩌면 다소 특이한 구성), cd방금 만든 디렉토리와 다른 디렉토리로 이동할 수 있습니다. ./상대 경로 앞에 추가하면이 문제 CDPATH가 해결됩니다 ( 무시됩니다).
  • 경우 mkdir에 실패, 그것을 실행하려고합니다 cd. 수정 : &&두 명령을 분리하는 데 사용하십시오.

여전히 매우 간단합니다.

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

이 버전은 여전히 cd한 가지 mkdir경우에 방금 만든 디렉토리와 다른 디렉토리로 이동할 가능성 이 mkcd있습니다 . 인수가 포함되어 ..기호 링크를 통과하는 경우. 현재 디렉토리는 예를 들어, /tmp/heremylink심볼 링크에 /somewhere/else, 다음 mkdir mylink/../foo생성 /somewhere/else/foo하는 반면 cd mylink/../foo에 변화 foo. 쉘은 자신의 현재 디렉토리에서 심볼릭 링크를 추적하기 때문에 인수에서 심볼릭 링크를 찾는 것으로 충분 cd /tmp/mylink; mkdir ../foo; cd ../foo하지 않으므로 새 디렉토리 ( /somewhere/else/foo) 로 변경되지 않습니다 /tmp/foo. 이를위한 해결책은 cd내장이 모든 ..경로 구성 요소를 먼저 해결 하도록하는 foo/..것입니다.foo존재하지 않으므로 ) mkdir를 볼 필요 가 없습니다 ...

약간 까다로운 버전이라면이 강력한 기능을 사용할 수 있습니다.

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를 복원하려고합니다.


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

  • 이전 명령에서 마지막 인수를 삽입하려면을 입력 cd 한 다음 Esc .(또는 Alt+ .)를 입력하십시오.
  • cd !$실행 cd이전 명령의 마지막 인수에.
  • 눌러 Up변경을 편집 한 후, 이전 명령 행을 불러 mkdircd.

감사! Esc. 가장 편리한 것 같습니다. 키 시퀀스에 특별한 의미가 있습니까?
methodofaction

"이전 명령의 마지막 단어 반복"에 대한 Bash (및에서 상속 ksh되며 또한 작동합니다 zsh) 순서입니다. 나는 그것을 자주 사용합니다.
geekosaur

30
@Gilles 저는 "Gilles"계정이 실제로 전문가 패널과 공유되고 있다고 생각하기 시작했습니다. ;-)
Keith

@StephaneChazelas /a/b/..//는 실제로 작동하지만 작동하지 않습니다 /a/b/../c. 결정된. 더 많은 사람들에게 질문을했습니다.
Gilles

1
mkcd() { mkdir -p "$1" && cd "$1"; }(내 인스턴스) zsh에서 문제가되지 않는 것 같습니다. mkdir -p /var/tmp/somewhere/else /tmp/here; cd /tmp/here; ln -s /var/tmp/somewhere/else mylink; mkdir -p mylink/../foo && cd mylink/../foo; pwd(설정 포함) 표시 /tmp/here/foo되는 내용과 예상 한 내용을 표시합니다 . bash오류가 발생하여로 변경되었습니다 /var/tmp/somewhere/foo.
Adam Katz

133

이것은 당신이 필요로하는 하나의 라이너입니다. 다른 구성이 필요하지 않습니다.

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)


23
지구상에서 왜 이것이 정답이
아닌가

1
@JSmyth 동의합니다. 이것은 네이티브 쉘 기능을 사용하는 하나의 라이너입니다.
14 분 56 초

OP가 두 명령을 사용하지 않으려 고한다고 생각합니다. 이 답변은 (거의)하는 것만 큼 유효 mkdir foo && cd foo합니다.
josemigallas

7
영업 이익은 디렉토리 이름을 반복 할 필요가없는 한 라이너를 요구하고, 이것은 그 것이다
헤수스 카레라

이것은 당신이 말하고 있거나 다른 사람들이 문서 / 튜토리얼에서 사용하는 것을 보았던 전통적인 한 줄짜리 라이너입니다. 실제로 여기에는 3 가지 완벽한 답변이 있습니다. 이것은 @ jordan-harris의 답변이며 선택된 답변입니다. 설정 및 환경 설정에 따라 다릅니다.
웨이드

30

거의 매시간마다 다음을 입력하기 때문에이 동작을 스크립팅 한 적이 없었습니다 ...

$ mkdir someDirectory<ENTER>
$ cd !$

bash !$는 마지막 줄의 마지막 단어를 친절하게 대체 합니다. 즉, 입력 한 긴 디렉토리 이름입니다.

또한 파일 이름 완성은 이러한 상황에서 친구입니다. 새 디렉토리가 폴더의 유일한 파일 인 경우 빠른 두 배 TAB는 새 디렉토리를 다시 입력하지 않고 제공합니다.

bash를 사용하면 다른 답변과 같이 일반적인 작업을 스크립팅 할 수 있다는 것이 멋지지만 다른 컴퓨터에서 작업 할 때 구문이 누락되지 않도록 bash가 제공하는 명령 줄 편집 기능을 배우는 것이 좋습니다. 사용자 정의 스크립트가 제공하는 설탕.


1
이와 같은 가장 중요한 배쉬 문제에 대해 알아볼 수있는 좋은 장소가 있습니까?
dominicbri7

@ dominicbri7 일반적으로 "bash 명령 줄 편집"에 포함됩니다. 인터넷 검색 결과 다음과 같은 결과를 얻을 수 있습니다. web.mit.edu/gnu/doc/html/features_7.html 보다 구체적으로! $는 Word Designator의 예입니다 . gnu. org / software / bash / manual / bashref.html # Word-Designators
Rob

17

따라 하면 어떤 사용자는 생산성을 높이기 위해 쉘 프로파일 짓을 한거야? , 이것이 내가하는 방법입니다.

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

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


4
-pMKDIR에 대한 옵션은 오류가 표시되지 않습니다.
glenn jackman 5

1
mcd는 이미 존재하는 명령입니다. 방금 예를 들었지만 mkcd보다 짧은 문자이므로 직접 사용했습니다.
Dharmit

@Dharmit Shah : 기존 mcd명령 은 무엇입니까 ? 어떤 패키지 또는 프로젝트가이 명령을 제공합니까?
Mikel

2
mtools는 mcd 명령을 제공합니다. 매뉴얼 페이지에 "mcd 명령은 MS-DOS 디스크에서 mtools 작업 디렉토리를 변경하는 데 사용됩니다."
Dharmit

13

Oh My Zsh를 사용하면 take 라는 명령 이 있습니다. 이런 식으로 보일 것입니다.

take myfolder

실제로 우연히 발견했습니다. 방금 보았는데 Oh My Zsh GitHub 위키 의이 속임수에 나와 있습니다. 그것은 매우 유용한 명령이며, 자신을 만들기가 매우 쉽습니다.


1
나는 결코 몰랐다 take:) Perfect! btw-Oh My Zsh가 포함 된 iTerm2. 실제로 여기에는 3 가지 완벽한 답변이 있습니다. 이것은 @ jesús-carrera의 하나이며 선택한 답변입니다. 설정 및 환경 설정에 따라 다릅니다.
웨이드

3

또는 짧은 변수를 즉석에서 만들어 두 번 사용할 수 있습니다 x = longproject ; mkdir $x ; cd $x. 쉘 스크립트 함수를 사용하는 것보다 여전히 깁니다. :)


0

다음은 언급 할 가치가있는 약간의 변형입니다.

function mkdir() {
    local dir=$1
    command mkdir "$dir"  &&  cd "$dir"
}

당신이 추가 ~/.bash_profile하면 다음 사용할 수 있습니다 mkdir(당신이 일단 정상적으로 source지금은 기능 이상이 아닌 표준 실행을 제외하고, '그것을 D) mkdir명령을 사용합니다.

이것은 Gilles 의 허용 된 답변에 따라 입력의 유효성을 검사하지는 않지만 내장을 (효과적으로) 재정의하는 방법을 보여줍니다.

문서에서 (약간 그림으로 표시) :

command mkdir [args]이라는 쉘 함수 mkdirargs무시하고 실행됩니다 mkdir. 쉘 내장 명령 또는 PATH 검색으로 찾은 명령 만 실행됩니다. 라는 이름의 쉘 기능이있는 경우 ls, 실행 command ls함수 내 것은 외부 명령을 실행하는 것 ls대신 재귀 함수를 호출

저는 믿습니다 builtin비슷한 결과를 달성 command.


당신은 확실히 인용해야합니다$dir
Jeff Schaller

@ Jeff는 동의했지만 허용 된 답변에는 필요한 모든 유효성 검사가 있습니다. 나는 단지 command대안으로 의 사용을 제시하고 있습니다 .
Arj

0

BASH, ZSH 또는 KSH에 도우미 기능 추가

mkcd한 줄로 환경에 대한 명령 작성

echo -e 'mkcd() {\n mkdir -p "$1" && cd $_\n}' >> ~/.${0//-/}rc && . ~/.${0//-/}rc


-1

위의 답변을 자동화하고 일회성 실행 스크립트를 만들었습니다.

fun='
mkcd ()
{
    mkdir -p -- "$1" && cd -P -- "$1"
}'

echo "$fun" >> ~/.bashrc

이 파일을 새 파일에 복사 하고 터미널 by에서 한 번만mkcd.sh 실행하십시오 . 그런 다음 현재 세션에서 작동 하도록 실행 하십시오.bash mkcd.shsource ~/.bashrc

그 후에 mkcd some_dir는 해당 디렉토리에서 직접 작성하고 입력 할 수 있습니다 .


파일에 추가하는 것이 유일한 목적인 스크립트 (파일로)를 작성하는 것이 좋습니다 ( ~/.bashrc이미 답변이 제공됨)? 이 mkcd.sh스크립트를 만드는 방법은 무엇입니까? 편집자와 함께? 이것은 단순히 편집하는 것보다 더 많은 일처럼 보입니다 ~/.bashrc. 이것이 허용되는 답변보다 어떤 이점이 있습니까? …………………………………………… PS PS 인용 문제로 인해 실패 할 것입니다.
Scott

유감스럽게 말하지만 대답에 썼을 때 위의 답변을 사용했습니다. 작동합니다. 당신이 나를 믿지 않으면 시도해보십시오. 그리고 시도하지 않는 것에 대해, 나는 오늘 하루를 bash와 python으로 작성했습니다.
subtleseeker

나는 당신이 쓴 것을 시도했습니다. 작동 하지 않습니다 .
Scott
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.