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

다음을 많이 반복합니다.

 mkdir longtitleproject cd longtitleproject  

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

댓글

    iv id = “917c2d41ba”의

  • mcd >

unix.stackexchange.com/questions/6628/ …

  • 관련 (더 일반적인) : (스크립팅없이) 하나의 인수에서 두 개의 명령을 실행합니다 .
  • mkdir longtitleproject 다음에 cd !^
  • 또한 askubuntu.com/q/927463/295286 askubuntu.com/q/249314/295286
  • 답변

    이것은 필요한 한 줄입니다. 다른 구성이 필요하지 않습니다.

    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)

    댓글

    • 이 답변이 허용되지 않는 이유
    • @JSmyth 동의합니다. , 이것은 기본 셸 기능을 사용하는 한 줄입니다.
    • OP가 두 명령을 사용하지 않으려 고 노력하고 있다고 생각합니다. 이 답변은 (거의) mkdir foo && cd foo를 수행하는 것만 큼 유효하며 ‘ 편리하지 않습니다.
    • OP는 ‘ 디렉토리 이름을 반복 할 필요가없는 한 줄짜리 라인을 요청합니다.이게 다입니다.
    • 추천으로 ‘ 많은 사람들이이 답변이 유용하다고 생각하고 있습니다. 이 답변을 선택하지 않은 ‘ 이유를 설명하겠습니다. ‘ ‘ 매우 키가 홈 행에서 너무 멀리 떨어져 있기 때문에 && cd $_를 잘못 입력 할 가능성이 있으므로 기술적으로 정확하지만 인체 공학적이지 않습니다. ‘ 환경에 의존하지 않고 ‘ 알면 유용하다는 사실에 ‘ 감사합니다. 감사합니다!

    답변

    내장 된 명령이 없지만 다음과 같은 함수를 쉽게 작성할 수 있습니다. mkdir를 호출 한 다음 cd :

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

    이 코드를 입력합니다. ~/.bashrc 파일 (또는 ksh 사용자의 경우 ~/.kshrc, zsh 사용자의 경우 ~/.zshrc). mkcd라는 함수를 정의합니다. "$1"는 실행시 함수의 인수로 대체됩니다.

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

    • 한 번에 하위 디렉터리 체인을 만들 수 없습니다. 수정 : -p 옵션을 mkdir. (오타가 감지되지 않을 위험을 증가시키기 때문에 바람직 할 수도 있고 아닐 수도 있습니다. 예를 들어 mkcd mydierctory/newsubmydierctorymydierctory/newsub 내부에 newsub를 만들려는 경우 기존 mydirectory.)
    • 인수가 -로 시작하지만 단순히 , mkdircd는이를 옵션으로 해석합니다. - 인 경우 cd$OLDPWD를 의미하는 것으로 해석합니다. + 뒤에 0 개 이상의 숫자가 나오면 zsh의 cd는이를 디렉토리 스택의 색인으로 해석합니다. 인수 앞에 --를 전달하여 첫 번째 문제를 해결할 수 있지만 나머지 두 문제는 해결할 수 없습니다. “상대 경로”인 경우 인수 앞에 ./를 추가하여 이러한 모든 문제를 해결할 수 있습니다.
    • mkdir CDPATH를 따르지 않지만 cd는 따르므로 CDPATH를 설정 한 경우 .로 시작하지 않는 값 (당연히 다소 비정상적인 구성)으로 설정하면 cd와 다른 디렉터리로 이동할 수 있습니다. 방금 만들어진 것입니다.상대 경로 앞에 ./를 추가하면이 문제가 해결됩니다 ¹ (이로 인해 CDPATH가 무시 됨).
    • mkdir 실패, cd 실행을 시도합니다. 수정 : &&를 사용하여 두 명령을 분리합니다.

    아직 매우 간단합니다.

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

    이 버전은 여전히 cd이 (가) 다른 디렉토리로 이동하도록 할 수 있습니다. mkdir가 하나의 엣지 케이스에서 방금 생성되었습니다. mkcd에 대한 인수에 ..가 포함되어 있고 심볼릭 링크를 통과합니다. 예를 들어 현재 디렉토리가 /tmp/here이고 mylink/somewhere/else에 대한 심볼릭 링크 인 경우 , 그러면 mkdir mylink/../foo/somewhere/else/foo를 생성하는 반면 cd mylink/../foofoo. 셸은 자체 현재 디렉터리에서 심볼릭 링크도 추적하므로 인수에서 심볼릭 링크를 찾는 것만으로는 충분하지 않습니다. 따라서 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로 변경하려면

    ¹주의하십시오. 93u + m / 1.0.0-alpha에서 수정 된 u+ 버전 이후 ksh93에서 작동하지 않습니다. + d1483150 2021-01-05

    댓글

    • 감사합니다. Esc.가 나에게 가장 편리한 것 같고 키 시퀀스를 사용합니다. 특별한 m을 가지고 eaning?
    • ‘는 Bash (ksh에서 상속되며 zsh) ” 이전 명령의 마지막 단어 반복 “. 꽤 자주 사용합니다.
    • @Gilles I ‘ ” Gilles ” 계정은 실제로 전문가 패널이 공유합니다. 😉
    • @StephaneChazelas /a/b/..//는 실제로 작동하지만 /a/b/../c는 작동하지 않습니다. 결정된. ‘ 더 많은 청중에게 질문을했습니다.
    • 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를 잘못 생성하고 변경합니다.

    답변

    거의 매시간마다 다음을 입력했기 때문에이 동작을 스크립팅 할 수 없었을 것입니다 …

    $ mkdir someDirectory<ENTER> $ cd !$ 

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

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

    bash가 허용하는 것은 멋지지만 다른 답변에서 제안하는 것처럼 일반적인 작업을 스크립팅하려면 bash가 제공해야하는 명령 줄 편집 기능을 배우는 것이 더 낫다고 생각합니다. 그래야 다른 컴퓨터에서 작업 할 때 사용자 지정 스크립트가 제공하는 구문 설탕을 놓치지 않습니다.

    댓글

    Answer

    Oh My Zsh, 정확히이 작업을 수행하는 take 라는 명령이 있습니다. 다음과 같이 보일 것입니다.

    take myfolder 

    실제로이 파일을 우연히 찾았습니다. 방금 살펴본 결과 이 치트 히트 매우 유용한 명령이며 직접 생성하기가 매우 쉽습니다.

    댓글

    • 🙂 완벽합니다! btw-iTerm2 with Oh My Zsh. 실제로 여기에 완벽한 답이 3 개 있습니다.이 답은 @jes ú s-carrera, 선택한 답변입니다. 설정 및 환경 설정에 따라 다릅니다.

    답변

    생산성을 높이기 위해 셸 프로필에서 어떤 사용자 정의를 수행 했습니까? , 내가하는 방법은 다음과 같습니다.

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

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

    댓글

    • mkdir에 대한 -p 옵션 오류를 표시하지 않습니다.
    • mcd는 이미 존재하는 명령입니다. ‘ 방금 예제를 제공했지만 직접 사용했습니다. ‘ mkcd보다 짧은 글자입니다.
    • @Dharmit Shah : 기존 mcd 명령은 무엇입니까? 이 명령을 제공하는 패키지 또는 프로젝트는 무엇입니까?
    • mtools는 mcd 명령을 제공합니다. 설명서 페이지에 ” mcd 명령은 MS-DOS 디스크의 mtools 작업 디렉토리를 변경하는 데 사용됩니다. ”

    답변

    또는 즉시 짧은 변수를 만들어 두 번 사용할 수 있습니다. x = longproject ; mkdir $x ; cd $x-쉘 스크립트 함수를 사용하는 것보다 더 오래 걸린다는 것을 인정합니다. 🙂

    Answer

    이것은 bash 스크립트 / 함수에서 할 수있는 간단한 일입니다. Linux와 MacOS 모두에서 작동하는 스크립트를 포함하여 매우 읽기 쉽고 충분히 문서화 된 자습서를 만들었습니다 (향후에도 유지 될 예정입니다).

    튜토리얼 복잡성에 대한 저의 목표는 다음과 같습니다. 사용자는 맥박이 있고 영어를 읽을 수있는 유일한 전제 조건이므로 도움이 필요하면 피드백을 제공하세요.

    https://github.com/craigopie/shellscripts

     mcdir() { if [ $# -eq 0 ] || [ $1 = "-h" ] || [ $1 = "--help" ] then echo "Usage: [option...] {directory}" echo " -p, --path Create all directories in path " echo " -h, --help Shows this helpful information " echo return 0 fi ## create directory with a path if [ $1 = "-p" ] || [ $1 = "--path" ] then mkdir -p "$2" &>/dev/null if [ $? -gt 0 ] then echo "There was a problem creating your directory." return 1 fi cd "$2" &>/dev/null if [ $? -gt 0 ] then echo "Unable to change into that directory." return 1 fi return 0 fi ## create directory in this location mkdir "$1" &>/dev/null if [ $? -gt 0 ] then echo "There was a problem creating your directory." return 1 fi cd "$1" &>/dev/null if [ $? -gt 0 ] then echo "Unable to change into that directory." return 1 fi return 0 } export -f mcdir  

    이것을 설치하려면 두 개의 옵션 :

    • 첫 번째는 .bashrc 파일에 함수를 추가하는 것입니다.
    • 두 번째는 경로에 파일을 추가하는 것입니다. 그런 다음 .bash_profile 파일에서 파일을 소싱합니다.

    다시 한 번 README 파일에서이 작업을 수행하는 방법에 대해 자세히 설명합니다.

    행운을 빕니다!

    답변

    여기에 언급 할만한 약간의 변형이 있습니다.

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

    요에 추가 ur ~/.bash_profile 그러면 정상적으로 mkdir를 사용할 수 있습니다 ( “source” d it), 지금을 제외하고는 표준 mkdir 명령이 아닌 위의 함수를 실행합니다.

    참고, 이것은 허용 된

    Gilles의 답변 이지만 내장 기능을 (효과적으로) 재정의 할 수있는 방법을 보여줍니다.

    문서 (약간 패러 프레이징) :

    command mkdir [args] 실행 mkdirargsmkdir라는 셸 함수를 무시합니다. PATH를 검색하여 찾은 쉘 내장 명령 또는 명령 만 실행됩니다. ls라는 셸 함수가있는 경우 함수 내에서 command ls를 실행하면 외부 명령 ls 함수를 재귀 적으로 호출하는 대신

    builtin

    .

    댓글

    • $dir
    • @Jeff, 동의했지만 수락 된 답변에는 필요한 모든 유효성 검사가 있습니다.’ 대안으로 command의 사용을 소개하고 있습니다.

    답변

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

    다음 위치에서 환경에 mkcd 명령 만들기 한 줄

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

    답변

    Oh-my-zsh를 사용하는 경우 , take 명령이 트릭을 수행합니다. 치트 시트 를 살펴보세요.

    답변

    위 답변을 자동화하고 한 번 실행 가능한 스크립트를 만들었습니다.

    fun=" mkcd () { mkdir -p -- "$1" && cd -P -- "$1" }" echo "$fun" >> ~/.bashrc 

    이 파일을 새 파일에 복사합니다. mkcd.sh를 실행하고 터미널에서 bash mkcd.sh 한 번만 실행합니다. 그런 다음 source ~/.bashrc를 실행하여 현재 세션에서 작동하도록합니다.

    이후 mkcd some_dir를 사용하여 해당 디렉토리에 직접 입력하십시오.

    댓글

    • 파일 (이미 제공된 답변 포함)? 이 mkcd.sh 스크립트를 만드는 방법은 무엇입니까? 편집자와 함께라면? 이것은 ~/.bashrc를 편집하는 것보다 더 많은 작업처럼 보입니다. 이것이 받아 들여진 대답에 비해 어떤 이점이 있습니까? ……………………………………………………………………… 추신 이것은 인용 문제로 인해 실패 할 것입니다. 이것은 당신이 직접 시도조차하지 않았다는 것을 나타냅니다.

    • 미안하지만 대답에 적었으므로 위의 답변을 사용했습니다. 작동합니다. 나를 믿지 않는다면 ‘ 해보세요. 그리고 노력하지 않는 것에 대해, 저는 오늘 하루 종일 그런 스크립트를 bash와 python으로 작성했습니다.
    • 당신이 작성한 것을 시도했습니다. 작동하지 않습니다 .

    답글 남기기

    이메일 주소를 발행하지 않을 것입니다. 필수 항목은 *(으)로 표시합니다