ฉันจะสร้างไดเรกทอรีและเปลี่ยนไดเรกทอรีทำงานเป็นไดเรกทอรีใหม่ได้อย่างไร


18

ฉันกำลังหาวิธีในการสร้างไดเรกทอรีและเปลี่ยนไดเรกทอรีทำงานปัจจุบันของฉันเป็นไดเรกทอรีที่สร้างขึ้นใหม่เพียงแค่ใช้คำสั่งเดียว ฉันจะทำสิ่งนี้ได้อย่างไร

เช่นแทนที่จะทำ

user@Computer:~$ mkdir NewDirectory
user@Computer:~$ cd NewDirectory
user@Computer:~/NewDirectory$ 

ฉันอยากจะทำ

user@computer:~$ **command** NewDirectory
user@Computer:~/NewDirectory$

สิ่งที่สามารถสั่งเป็นอย่างไร

คำตอบ:


27

หากคุณต้องการให้มันเป็นเพียงคำสั่งเดียวฉันขอแนะนำให้เพิ่มสิ่งนี้ในของคุณ.bashrc:

md () { mkdir -p "$@" && cd "$1"; }

เข้าสู่md fooบรรทัดคำสั่งจากนั้นจะสร้างไดเรกทอรีที่เรียกว่าfooและcdเข้าไปในนั้นทันทีหลังจากนั้น โปรดทราบว่าคุณจะต้องโหลดซ้ำ.bashrcเพื่อให้การเปลี่ยนแปลงมีผล (เช่นเปิดคอนโซลใหม่หรือเรียกใช้source ~/.bashrc)

cf เลย http://www.commandlinefu.com/commands/view/3613/create-a-directory-and-change-into-it-at-the-same-timeสำหรับทางเลือกที่เป็นไปได้เช่นกัน


19

mkdir "NewDirectory" && cd "NewDirectory"

  • ส่วนหลัง&&จะดำเนินการเฉพาะเมื่อคำสั่งที่ 1 ประสบความสำเร็จ
  • มันเรียกว่ารายการของคำสั่งในคู่มือทุบตี
  • นอกจากนี้ยังมีรุ่นชวเลข:

    mkdir "NewDirectory" && cd "$_"
    
  • ตัวอย่างจากบรรทัดคำสั่ง:

    $ false && echo "yes"
    $ true && echo "yes"
    yes
    
  • (แก้ไข) เพิ่ม "ลงในคำสั่งเนื่องจากไดเรกทอรีอาจมีช่องว่าง


mkdir "NewDir" && cd "$_"ทำงานได้ดีกว่าmkdir "NewDir" && cd "NewDir"การเติมข้อความอัตโนมัติไม่ทำงาน BTW "$ _" คืออะไร?
TheKojuEffect

ยิ่งไปกว่านั้นมันจะค่อนข้างมีประโยชน์ถ้าเราสามารถแนบสวิตช์mkdirเพื่อเปลี่ยนเป็นไดเรกทอรีใหม่ที่สร้างขึ้น
TheKojuEffect

@TheKojuEffect $ _ ดูgnu.org/software/bash/manual/bashref.html#Lists เกี่ยวกับสิ่งสุดท้าย: ไม่มีใครหยุดคุณจากการใช้นามแฝงหรือฟังก์ชั่นภายใน.bashrc;)
Rinzwind

7

ไม่มีฟังก์ชันในตัว แต่คุณสามารถใช้ฟังก์ชันการทำงานของเชลล์เพื่อช่วยให้คุณไม่ต้องพิมพ์อาร์กิวเมนต์ของcdคำสั่งอีกครั้งหลังจากทำงานmkdir:

  • พิมพ์cd แล้วEsc .(หรือAlt+ .) เพื่อแทรกอาร์กิวเมนต์ล่าสุดจากคำสั่งก่อนหน้า
  • cd !$รันcdบนอาร์กิวเมนต์สุดท้ายของคำสั่งก่อนหน้า
  • กดUpเพื่อระลึกถึงบรรทัดคำสั่งก่อนหน้านี้แล้วแก้ไขมันจะเปลี่ยนเข้าสู่mkdircd

คุณสามารถกำหนดฟังก์ชั่น make-and-change-directory ง่ายๆใน~/.bashrc:

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

โหลดของคุณ.bashrc( . ~/.bashrc) mkcd new-directoryหรือทุบตีเริ่มต้นและตอนนี้คุณสามารถพิมพ์

เวอร์ชั่นง่าย ๆ นี้ล้มเหลวในบางกรณีที่ผิดปกติเกี่ยวกับชื่อไดเรกทอรีแปลก ๆ..และลิงค์สัญลักษณ์ นี่คือสิ่งที่ทำ สำหรับคำอธิบายดูยูนิกซ์และลินุกซ์รุ่นของคำถามนี้

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

+1 ของฉันเฉพาะสำหรับการอ้างอิง Bash เฉพาะกับอาร์กิวเมนต์ของคำสั่งสุดท้าย
0xC0000022L

+1 นานกว่าวิศวกรรม Excelsior! :)
mhvelplund

3
mkdir -p "as/many dirs/as you/want" && cd "$_"

มีวิธีแก้ไขปัญหาข้างต้น (เช่นเดียวกับโซลูชันของฉัน แต่ไม่มีตัวเลือก -p) แต่ฉันคิดว่ามันมีข้อผิดพลาดเล็กน้อย

man mkdir
...
-p, --parents
       no error if existing, make parent directories as needed
...

สิ่งนี้ให้ประโยชน์สองประการแก่เรา:

  1. เราสามารถสร้างไดเรกทอรีย่อยได้มากเท่าที่ต้องการในครั้งเดียว
  2. หากมีไดเรกทอรีอยู่มันจะไม่ทิ้งข้อผิดพลาดและเราจะยังคงสามารถเปลี่ยนเป็นไดเรกทอรีที่มีอยู่

&& cd "$_"จะเปลี่ยนเป็นไดเรกทอรีที่สร้างขึ้นใหม่เนื่องจาก$_ถือค่าส่งคืนของฉันmkdir


สิ่งนี้ใช้ได้กับฉัน
alhelal
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.