เขียนทับไดเรกทอรีที่มีอยู่หรือไม่


11

ฉันมีชื่อไดเรกทอรีที่ตั้งอยู่ในfoo ~/Desktopสมมติว่าฉันต้องการสร้างไดเรกทอรีจาก terminal ที่มีชื่อเดียวกันและอยู่ในตำแหน่งเดียวกัน เมื่อฉันลองmkdirมันทำให้เกิดข้อผิดพลาด:

mkdir: cannot create directory `/home/nux/Desktop/foo': File exists

นั่นเป็นเหตุผล แต่ฉันต้องการแทนที่fooหากมีอยู่ ฉันมองผ่านman mkdirแต่ไม่มีตัวเลือกใด ๆ ที่ทำเช่นนั้น

ดังนั้นจะเขียนทับfooไดเรกทอรีได้อย่างไร

ทำไมไม่มีmkdirตัวเลือกในการทำเช่นนี้?


แทนที่fooเหมือนลบเนื้อหาทั้งหมดหรือไม่ mkdirมี-pตัวเลือกที่ละเว้นหากไดเรกทอรีอยู่
muru

4
ดังนั้นคุณต้องการคำสั่งที่จะลบไฟล์ทั้งหมดในไดเรกทอรีเมื่อคุณสร้างไดเรกทอรีใหม่ด้วยชื่อเดียวกันโดยบังเอิญ? และคุณสงสัยว่าทำไมมันไม่มีตัวเลือกใด ๆ ? นี่เรื่องตลกใช่ไหม?
Marty ผัด

downvoters เพียงแค่ชี้แจงว่าเหตุใดฉันจึงถามเกี่ยวกับคำสั่งหนึ่งคำสั่งที่ลบไดเรกทอรีที่มีอยู่
nux

1
@nux กับฉันคำถามไม่มีเหตุผล ... อธิบายว่าทำไมคุณถึงต้องการลบและสร้างไดเรกทอรีใหม่ เรามีคำสั่งสำหรับสิ่งที่คุณต้องทำในไดเรกทอรี mkdir ไม่จำเป็นต้องมีตัวเลือกในการลบ / สร้างใหม่
Rinzwind

1
นี่เป็นอาชญากรรมหรือไม่หากฉันกำลังถามคำถามเชิงตรรกะ !!
nux

คำตอบ:


21

หากเป้าหมายของคุณคือดำเนินการคำสั่งหนึ่งบรรทัดที่:

  • ลบและสร้างไดเรกทอรีใหม่~/Desktop/fooหากมีอยู่แล้ว
  • เพียงสร้างไดเรกทอรี~/Desktop/fooหากยังไม่มีอยู่

จากนั้นคุณสามารถใช้:

rm -r ~/Desktop/foo; mkdir ~/Desktop/foo

; เทียบเท่ากับการขึ้นบรรทัดใหม่ แต่จะช่วยให้คุณสามารถรันคำสั่งหลายคำสั่งในบรรทัดเดียว (เช่น "คำสั่งเดียว")

  • หากไดเรกทอรีที่คุณลบอาจมีไฟล์แบบอ่านอย่างเดียวคุณจะต้อง-fตั้งค่าสถานะเพื่อลบออกโดยไม่ต้องให้ผู้ใช้โต้ตอบ ไม่เป็นไร แต่ฉันแนะนำให้ระมัดระวังเป็นrm -rf ...พิเศษ ดูman rmรายละเอียดที่
  • คุณต้องใช้rmคำสั่งให้เสร็จก่อนที่mkdirคำสั่งจะทำงาน นี่คือเหตุผลที่จะใช้แทน; &(คำสั่งก่อนหน้านี้&ทำงานแบบอะซิงโครนัสในพื้นหลัง)
  • คุณต้องการให้mkdirคำสั่งรันเมื่อrmคำสั่งสำเร็จ นี่คือเหตุผลที่จะใช้แทน;||
  • คุณต้องใช้mkdirคำสั่งเพื่อรันเมื่อrmคำสั่งล้มเหลว (โดยปกติความล้มเหลวจะหมายถึงไดเรกทอรีที่ไม่มีอยู่) นี่คือเหตุผลที่จะใช้แทน;&&
  • rmคำสั่งอาจล้มเหลวแม้เมื่อไดเรกทอรีมีอยู่แล้วซึ่งในกรณีที่mkdirคำสั่งจะล้มเหลวเช่นกัน แต่ข้อผิดพลาดจะทำให้รู้สึกและมีอาจไม่จำเป็นต้องเพิ่มขั้นตอนการตรวจสอบกลางสำหรับfooการดำรงอยู่ของก่อนที่จะพยายามที่จะสร้างมันขึ้นมา

ดู3.2.3 รายชื่อคำสั่งในคู่มือการทุบตีอ้างอิงสำหรับข้อมูลเพิ่มเติมและคำอธิบายเกี่ยวกับ;, &, ||และ&&ผู้ประกอบการ

ตามที่muru แนะนำ (และรายละเอียด Rinzwind ) ฉันแนะนำให้คุณดูrsyncเพื่อดูว่าจะตอบสนองความต้องการสำรองข้อมูลของคุณหรือไม่ มีคำแนะนำที่เป็นประโยชน์เพิ่มเติมในหน้าเอกสารคู่มือrsyncเช่นเดียวกับคู่มือ Ubuntu rsyncนี้

ทำไม mkdir ไม่มีตัวเลือกนี้

mkdirสร้างไดเรกทอรี ("mk" หมายถึง "make" ) เพราะมันจะลบไดเรกทอรีซ้ำและไฟล์ทั้งหมดในพวกเขาจะไม่ดีเพราะมันจะละเมิดหลักการของความประหลาดใจอย่างน้อยในวิธีที่อาจนำไปสู่การสูญเสียข้อมูล

rmdirไม่ได้ลบไดเรกทอรีที่มีไฟล์ (ไม่ใช่ไดเรกทอรี) อยู่ด้วย rmมี-rตัวเลือกซึ่งเหมาะสมแล้วเนื่องจากrmคาดว่าจะลบไฟล์ (นั่นคือจุดประสงค์ของมันดังนั้นอันตรายที่แฝงอยู่นั้นคือสัญชาตญาณและผู้ใช้มักจะรู้ว่าต้องระวังเมื่อเรียกใช้rmคำสั่ง)


+1 ที่ยอดเยี่ยม คำตอบนี้เหนือกว่าการอธิบายไวยากรณ์สิ่งที่ฉันต้องการมีความลึกซึ้งยิ่งขึ้นในไซต์ stackexchange มีนักเก็ตทองคำจำนวนมากในคำตอบนี้
Govind Rai

7

ไม่ไม่มีคำสั่งเดียวที่จะทำสิ่งที่คุณถาม

ทำไม?

นี่คือปรัชญา Unix: เขียนโปรแกรมที่ทำสิ่งหนึ่งและทำได้ดี เขียนโปรแกรมเพื่อทำงานร่วมกัน 1

ในอินสแตนซ์นี้คำสั่งmkdirและrmทำสิ่งที่คุณต้องการและทำงานร่วมกันได้ดีเนื่องจากrm -rจะลบไดเรกทอรีเช่นกันดังนั้นภายหลังmkdirจะสร้างไดเรกทอรี

1 The Art of Unix Programmingเอริคเอสเรย์มอนด์เขียนข้อความโดยอ้างถึงดั๊กแม็คอิลรอย


สำหรับตอนนี้นั่นเป็นคำตอบที่ดีฉันจะค้นหา
nux

3

rmคำสั่งที่จะลบไดเรกทอรี ดังนั้นคุณต้องมี 2 คำสั่ง

rm -r ~/Desktop/foo/
mkdir ~/Desktop/foo/

ตามที่แสดงในความคิดเห็นคุณสามารถเชื่อมโยงพวกเขาด้วย ;(= ทำทั้งสองอย่างแม้ว่าที่ 1 ล้มเหลว) หรือ&&(= เฉพาะ mkdir เมื่อ rm ไม่ได้ล้มเหลว)

-rเป็นสำหรับการลบ dirs คำสั่งที่ 1 ยังลบเนื้อหาทั้งหมดของไดเรกทอรี หากที่ไม่ตั้งใจของคุณทั้ง RM และ mkdir จะไม่ใช่สิ่งที่คุณกำลังมองหา: สิทธิ์และchmodchown

ทำไม mkdir ไม่มีตัวเลือกนี้

ความคลุมเครือ mkdirหมายถึงทำไดเรกทอรี ไม่ลบและสร้างไดเรกทอรี และเนื่องจากrmคำสั่งนั้นใช้สำหรับลบสิ่งต่าง ๆ จึงไม่จำเป็นต้องrmdirสามารถลบไดเรกทอรีได้


ฉันรู้ว่า แต่ฉันหมายถึงหนึ่งคำสั่งคุณสามารถดูการแก้ไขของฉันฉันเปลี่ยนมัน
nux

ขั้นแรกให้อธิบายว่าทำไมคุณต้องสร้างไดเรกทอรีใหม่ นั่นทำให้ฉันไม่มีเหตุผล
Rinzwind

ความต้องการของฉันคืออะไรฉันแค่สงสัยว่าอย่างไร มันทำให้รู้สึกสำหรับฉัน :)
23914 nux

@ ไม่ได้มันไม่ได้ และผู้ดูแล mkdir ไม่เข้าใจว่าทำไม;) สิ่งที่คุณต้องการนั้นไร้ประโยชน์และไม่มีบุญ
Rinzwind

ตกลงถ้าคุณต้องการทราบว่าฉันกำลังสร้างสคริปต์เพื่อสำรองข้อมูลในไดเรกทอรีใหม่ด้วยชื่อเดียวกันของ foo และอนุญาตให้แทนที่หากมีอยู่เพื่อลดพื้นที่
nux

1

เมื่อต้องการทำสิ่งนี้ด้วยวิธีที่สะอาดที่สุดฉันใช้สิ่งนี้:

create_clean_directory(){
    dir_name=$1
    if [ -d "$dir_name" ]; then
        echo "Removing $dir_name"
        rm -rf "$dir_name"
    elif [ -f "$dir_name" ]; then
        echo "File with this name already exists, not a directory."
        exit
    fi
    if mkdir "$dir_name"; then
        echo "Clean directory created: $dir_name"
        return 0
    else
        echo "Creating directory failed: $dir_name"
        return 1
    fi 
}

และใช้มัน:

create_clean_directory <dir_name>

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

  1. -dตรวจสอบว่ามีไดเรกทอรีที่มีชื่อนั้นอยู่แล้วหรือไม่ ถ้าเป็นเช่นนั้นลบ

  2. -fตรวจสอบว่าไม่มีไฟล์ชื่อนี้อยู่ หากเป็นเช่นนั้นให้พิมพ์ข้อความแสดงข้อผิดพลาดและออก

  3. สร้างไดเรกทอรีใหม่และสำเร็จ echo หรือถ้าล้มเหลว echo ล้มเหลว

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