อะไรคือจุดที่แท้จริงของตัวเลือก -f บน rm?


14

โดยการอ่าน GNU coreutils man page สำหรับrmหนึ่งในตัวเลือกคือ-fตามคู่มือ

-f, --force
          ignore nonexistent files and arguments, never prompt

ตอนนี้ฉันทำการทดสอบและแสดงให้เห็นว่าถ้าฉันใช้สิ่งที่ชอบ

rm -f /nonexisting/directory/

มันจะไม่บ่น

สิ่งที่ใครบางคนสามารถได้รับจากตัวเลือกดังกล่าวจริง ๆ ?

รวมทั้งตัวอย่างที่พบบ่อยที่สุดของ "การลบไดเรกทอรี" โดยใช้rmคือสิ่งที่ต้องการ

 rm -rf /delete/this/dir

-rตัวเลือกที่จะทำให้ความรู้สึก แต่-f?

คำตอบ:


9

ฉันพบว่าหน้าคนขาดรายละเอียดเล็กน้อยในกรณีนี้ -fตัวเลือกของrmจริงมีค่อนข้างกรณีการใช้งานไม่กี่:

  • เพื่อหลีกเลี่ยงข้อผิดพลาดรหัสออก
  • เพื่อไม่ให้ถูกพรอมต์
  • เพื่อหลีกเลี่ยงการตรวจสอบสิทธิ์

คุณพูดถูกว่าไม่มีประโยชน์ที่จะลบไฟล์ที่ไม่มีอยู่จริง แต่ในสคริปต์มันสะดวกมากที่จะพูดว่า "ฉันไม่ต้องการไฟล์เหล่านี้ลบมันถ้าคุณเจอพวกเขา แต่อย่ารบกวนฉันถ้าพวกเขาไม่สวม ไม่มีอยู่ " บางคนใช้set -eในสคริปต์ของพวกเขาเพื่อที่จะหยุดการในข้อผิดพลาดใด ๆ (เพื่อหลีกเลี่ยงความเสียหายใด ๆ เพิ่มเติมสคริปต์ที่สามารถก่อให้เกิด) และง่ายกว่าrm -rf /home/my/garbageif [[ -f /home/my/garbage ]]; then rm -r /home/my/garbage; fi

หมายเหตุเกี่ยวกับการตรวจสอบการอนุญาต: หากต้องการลบไฟล์คุณต้องมีสิทธิ์ในการเขียนไปยังไดเรกทอรีหลักไม่ใช่ไฟล์นั้น ดังนั้นสมมติว่ามีไฟล์rootอยู่ในไดเรกทอรีภายในบ้านของคุณและคุณไม่มีsudoสิทธิ์เข้าถึงคุณยังสามารถลบไฟล์โดยใช้-fตัวเลือกได้ หากคุณใช้ Git คุณจะเห็นว่า Git ไม่ได้รับอนุญาตให้เขียนในไฟล์อ็อบเจ็กต์ที่สร้างขึ้น:

-r--r--r-- 1 phunehehe phunehehe 62 Aug 31 15:08 testdir/.git/objects/7e/70e8a2a874283163c63d61900b8ba173e5a83c

ดังนั้นถ้าคุณใช้rmวิธีเดียวที่จะลบที่เก็บ Git โดยไม่ต้องใช้คือการใช้งานrootrm -rf


4
-fไม่หลีกเลี่ยงรหัสทางออกที่ผิดพลาด หากrmพยายามและล้มเหลวในการลบไฟล์ที่มีอยู่มันจะส่งคืนรหัสข้อผิดพลาด
Gilles 'หยุดความชั่วร้าย'

ฉันได้ลงคะแนนคำตอบนี้เพราะ "ควรหลีกเลี่ยงข้อผิดพลาดรหัสทางออก" ควรเขียนเป็น "เพื่อหลีกเลี่ยงรหัสทางออกข้อผิดพลาดในกรณีที่ไม่มีตัวถูกดำเนินการไฟล์หรือตัวถูกดำเนินการไฟล์ไม่มีอยู่" ตามที่เขียนไว้ในคำตอบนี้มันผิด
Harold Fischer

6

-fตัวเลือกยับยั้งการแจ้งยืนยันเมื่อมีการลบไฟล์แบบอ่านอย่างเดียว นอกจากนี้ยังระงับข้อผิดพลาดเมื่อไม่มีไฟล์ที่ระบุอย่างน้อยหนึ่งไฟล์

-fตัวเลือกที่จะเป็นประโยชน์เมื่อคุณทราบว่าบางส่วนของไฟล์ที่คุณลบกำลังอาจจะอ่านอย่างเดียวและคุณไม่ต้องการที่จะได้รับแจ้งเกี่ยวกับเรื่องนี้

fตัวเลือกนอกจากนี้ยังจะเป็นประโยชน์เมื่อคุณต้องการที่จะลบไฟล์บางอย่างในกรณีที่พวกเขาอยู่และไม่ต้องการที่จะสนใจว่าพวกเขามีอยู่หรือไม่ สิ่งนี้มักใช้ในmakefilesเพื่อสร้างคำสั่งที่ลบไฟล์ที่สามารถสร้างใหม่ได้จากไฟล์ต้นฉบับ ตัวอย่างเช่นถ้าfoo.oสามารถสร้างขึ้นมาใหม่จากfoo.c, bar.oสามารถสร้างขึ้นมาใหม่จากbar.cและmyappสามารถสร้างขึ้นมาใหม่จากfoo.oและbar.oแล้วเป้าหมาย Makefile

clean:
        rm -f *.o myapp

ลบmyapp, foo.oและbar.oถ้าพวกเขาอยู่และไม่บ่นถ้าพวกเขาไม่อยู่

รวมถึง-fคำแนะนำในการลบทรีไดเรกทอรีไม่จำเป็นต้องใช้ในกรณีส่วนใหญ่ มันสามารถพิสูจน์ได้เพราะถ้าคุณแน่ใจว่าคุณต้องการลบทรีไดเรกทอรีนั้นโดยไม่คำนึงว่ามีอะไรอยู่ในนั้นคุณสามารถระบุ-fเพื่อหลีกเลี่ยงการได้รับพร้อมท์ในกรณีที่ไฟล์บางไฟล์เป็นแบบอ่านอย่างเดียว อย่างไรก็ตามคนที่พูดว่าทำงานrm -rfมักจะเพียงแค่ทำคาถาลึกลับเพื่อกำจัดบางสิ่งบางอย่างโดยไม่คำนึงว่าตัวเลือก-rและ-fจำเป็นจริง ๆ หรือไม่ หากไม่จำเป็นต้องใช้ตัวเลือกพวกเขาจะไม่แนะนำให้เลือกเพราะจะเพิ่มความเสี่ยงที่การพิมพ์ผิดในการโต้แย้งจะทำลายบางสิ่งที่สำคัญ


3

การ-iเปลี่ยนมาใช้rm

ฉันมักจะเห็น-fการใช้กับrmเมื่อrmคำสั่งเป็นนามแฝงเพื่อให้มี-iสวิตช์สำหรับการโต้ตอบ สวิทช์ต่อต้าน-f-i

ตัวอย่าง

จำลองปัญหากับการเป็นนามแฝงที่จะrmrm -i

$ alias rm='rm -i'

ทำข้อมูลปลอม

$ touch afile

ทีนี้ลองลบมันโดยใช้เวอร์ชันนามแฝงของ rm

$ rm afile 
rm: remove regular empty file `afile'?

ลองใช้ดู -f

$ rm -f afile 
$

สิทธิ์

นอกจากนี้ฉันเชื่อว่ามีหลายกรณีที่คุณเข้าถึงไดเรกทอรีแบบอ่านอย่างเดียวและเมื่อคุณพยายามลบไฟล์และหรือไดเรกทอรีย่อยในไดเรกทอรีดังกล่าวคุณจะได้รับการท้าทายด้วยข้อความแจ้งที่คล้ายกันว่า "คุณแน่ใจหรือไม่" การใช้-fกำจัดได้โดยไม่ต้องพูดว่าใช่


ด้วยการใช้นามแฝงมันทำให้รู้สึกบางอย่างแน่นอน และคำตอบของคุณตรงกับสิ่งที่ฉันเพิ่งแสดงในหน้าคน openbsd แม้ว่า openbsd ไม่ใช่ GNU / Linux ดูเหมือนว่าจะอธิบายสิ่งที่คุณเพิ่งพูด นี่คือลิงค์ถ้ามีคนต้องการตรวจสอบ: [ลิงค์] openbsd.org/cgi-bin/ …
saliarosaurus

ด้วย bash คุณสามารถ\rmเรียกใช้โดยไม่ใช้นามแฝง (\ เป็นทางลัดไปยังcommandบิวด์) ฉันพบว่าการใช้งานที่ดีที่สุดสำหรับ-fในเชลล์สคริปต์ที่คุณมีบางสิ่งบางอย่างเช่น lockfile ที่อาจจะมีหรือไม่มีอยู่ก็-fหยุดrm: cannot remove 'file': No such file or directoryคำเตือน
Drav Sloan

@DravSloan ใช่ว่ามันสมเหตุสมผลแล้ว ขอบคุณสำหรับคำตอบของคุณทั้ง Drav Sloan และ slm
saliarosaurus

ฉันใช้rm -fบ่อยตามcleanเป้าหมายในMakefiles
Alex

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