อ่าน 6 นาที
rm (Unix)
rm ` remove` ซึ่งย่อมาจาก ` remove` เป็น คำสั่ง เชลล์ สำหรับลบไฟล์ (รวมถึง ไฟล์พิเศษ เช่น โฟลเดอร์ ) ออกจาก ระบบไฟล์ คำสั่งนี้อาจไม่ได้ลบไฟล์จริง ๆ...
rm (Unix)
| อาร์เอ็ม | |
|---|---|
คำ rmสั่ง | |
| ผู้เขียนต้นฉบับ | เคน ทอมป์สัน , เดนนิส ริทชี ( เอทีแอนด์ที เบลล์ แล็บโบราทอรีส์ ) |
| นักพัฒนา | นักพัฒนาซอฟต์แวร์โอเพนซอร์สและเชิงพาณิชย์หลายราย |
| ปล่อย | 3 พฤศจิกายน 2514 |
| เขียนเป็น | ซี |
| ระบบปฏิบัติการ | ยูนิก , ระบบปฏิบัติการคล้ายยูนิก , V , Plan 9 , Inferno , KolibriOS , IBM i |
| แพลตฟอร์ม | ข้ามแพลตฟอร์ม |
| พิมพ์ | สั่งการ |
| ใบอนุญาต | coreutils : GPLv3+แผน 9: ใบอนุญาต MIT |
rm` remove`ซึ่งย่อมาจาก` remove` เป็นคำสั่งเชลล์ สำหรับลบไฟล์ (รวมถึงไฟล์พิเศษเช่นโฟลเดอร์ ) ออกจากระบบไฟล์คำสั่งนี้อาจไม่ได้ลบไฟล์จริง ๆ (ปล่อยพื้นที่จัดเก็บเพื่อนำไปใช้ใหม่) เนื่องจากมันเพียงแค่ลบลิงก์ – โดยการลบฮาร์ดลิงก์ไปยังไฟล์ผ่านการเรียกใช้ระบบหากไฟล์มีลิงก์หลายลิงก์และลบลิงก์ไม่ครบทั้งหมด ไฟล์นั้นจะยังคงอยู่ในระบบไฟล์และสามารถเข้าถึงได้ผ่านลิงก์อื่น ๆ เมื่อลบลิงก์เพียงลิงก์เดียวของไฟล์แล้ว ไฟล์นั้นก็จะถูกลบ – ปล่อยพื้นที่จัดเก็บเพื่อนำไปใช้ประโยชน์อื่น unlink()
โดยทั่วไปแล้ว พื้นที่จัดเก็บข้อมูลเดิมของไฟล์ที่ถูกลบจะยังคงมีข้อมูลของไฟล์นั้นอยู่ จนกว่าจะถูกเขียนทับด้วยเนื้อหาของไฟล์อื่น ข้อมูลนั้นไม่สามารถเข้าถึงได้ผ่านการดำเนินการไฟล์ตามปกติ แต่สามารถกู้คืนได้โดยใช้เครื่องมือเฉพาะทาง เนื่องจากในบางกรณีถือว่าเป็น ความเสี่ยง ด้านความปลอดภัย จึงมีโปรแกรมรักษาความปลอดภัย เวอร์ชันที่เข้มงวดcpกว่าที่ลบข้อมูลในพื้นที่จัดเก็บข้อมูลของไฟล์นั้นทั้งหมดเมื่อไฟล์ถูกลบ คำสั่งต่างๆ เช่นshredและsrmมีฟังก์ชันเฉพาะในการลบข้อมูล
เนื่องจากrmไม่มีกลไกสำรองในการกู้คืนไฟล์ เช่นถังรีไซเคิลการใช้งานจึงมีความเสี่ยงที่จะสูญเสียข้อมูลโดยไม่ได้ตั้งใจ[ 1 ]ผู้ใช้มักจะห่อหุ้มการเรียกใช้rmด้วยกลไกความปลอดภัยเพื่อจำกัดการลบโดยไม่ได้ตั้งใจ มี โปรแกรม กู้คืนไฟล์ที่พยายามสร้างดัชนีขึ้นใหม่และสามารถกู้คืนไฟล์ได้หากพื้นที่จัดเก็บไม่ได้ถูกนำกลับมาใช้ใหม่
เดิมทีพัฒนาขึ้นสำหรับUnixปัจจุบันสามารถใช้งานได้บน ระบบ ที่คล้าย Unixและระบบที่ไม่คล้าย Unix เช่นKolibriOS [ 2 ] IBM i [ 3 ] EFI shell [ 4 ] และ Windows (ผ่านUnxUtils ) [ 5 ] คำสั่ง นี้ให้ความสามารถที่คล้ายกันใน MS - DOS , OS/2และCommand Prompt del
เช่นเดียวกับ คำสั่งอื่นๆ คำสั่ง rmนี้unlinkยังใช้ลบไฟล์ (ยกเลิกการเชื่อมโยง) แต่จะลบได้ทีละไฟล์เท่านั้น
ประวัติศาสตร์
ในระบบ Unix บางเวอร์ชันเก่าrmคำสั่งจะลบไดเร็กทอรีหากว่างเปล่า[ 6 ]พฤติกรรมนี้ยังคงสามารถทำได้ในบางเวอร์ชันrmด้วย-dแฟล็ก เช่นBSD (เช่นFreeBSD [ 7 ] NetBSD [ 8 ] OpenBSD [ 9 ]และmacOS ) ซึ่ง พัฒนา มาจาก 4.4BSD - Lite2
เวอร์ชันในGNU Core Utilitiesเขียนโดย Paul Rubin, David MacKenzie, Richard Stallmanและ Jim Meyering [ 10 ]เวอร์ชันนี้มี-dตัวเลือกเพื่อช่วยเรื่องความเข้ากันได้[ 11 ]ฟังก์ชันการทำงานเดียวกันนี้มีให้โดยrmdirคำสั่ง มาตรฐาน
ตัวเลือก
ตัวเลือกที่มักมีให้ในการใช้งานคำสั่ง:
-rลบไดเร็กทอรีและเนื้อหาภายในแบบวนซ้ำ-iโต้ตอบได้ ; ขอให้ผู้ใช้ยืนยันการลบแต่ละไฟล์-fบังคับ;เพิกเฉยต่อไฟล์ที่ไม่มีอยู่จริงและยกเลิกข้อความยืนยันใดๆ (ซึ่งเป็นการยกเลิกโดยปริยาย-i) ไม่อนุญาตให้ลบไฟล์ออกจากไดเร็กทอรีที่ป้องกันการเขียน-v, v erbose; บันทึกสถานะ-dไดเร็กทอรี ; ลบไดเร็กทอรีที่ว่างเปล่าออก--one-file-systemลบเฉพาะไฟล์ที่อยู่ในระบบไฟล์เดียวกันกับที่ระบุในอาร์กิวเมนต์เท่านั้น ไม่สนใจระบบไฟล์ที่ถูกเมานต์ไว้
ใช้
โดยค่าเริ่มต้นrmจะลบไฟล์ที่ระบุ แต่จะไม่ลบไดเร็กทอรี[ 12 ]ตัวอย่างเช่น คำสั่งต่อไปนี้จะลบไฟล์ชื่อfoo
$ rm foo แต่คำสั่งนั้นจะใช้ไม่ได้ผลหากfooเป็นไดเร็กทอรี หากต้องการลบไดเร็กทอรีfoo :
$ rm -r foo คำสั่งนี้มักใช้ร่วมกับxargsเพื่อระบุรายการไฟล์:
$ xargs rm < filelist เพื่อลบภาพ PNG ทั้งหมด ในทุกไดเร็กทอรีที่อยู่ใต้ไดเร็กทอรีปัจจุบัน:
$ find . -name '*.png' -exec rm {} + ความปลอดภัย
สิทธิ์การเข้าถึง
ในระบบไฟล์ส่วนใหญ่ การลบไฟล์จำเป็นต้องมีสิทธิ์ในการเขียนและเรียกใช้งานในไดเร็กทอรีที่เก็บไฟล์นั้น บางคนอาจสับสนว่าสิทธิ์ในไฟล์ที่จะลบนั้นไม่สำคัญ อย่างไรก็ตาม การใช้งาน GNU ยืนยันว่าจะลบไฟล์ที่ป้องกันการเขียนเว้นแต่จะใช้ตัวเลือก -f [ 13 ]
ในการลบไดเร็กทอรี (โดยใช้-r) เนื้อหาภายในจะต้องถูกลบออกทั้งหมด ซึ่งต้องใช้สิทธิ์ในการอ่าน เขียน และเรียกใช้งานในไดเร็กทอรี (หากไม่ว่างเปล่า) และไดเร็กทอรีย่อยที่ไม่ว่างเปล่าทั้งหมดด้วย สิทธิ์ในการอ่านจำเป็นสำหรับการแสดงรายการเนื้อหาของไดเร็กทอรี บางครั้งสิ่งนี้ทำให้เกิดสถานการณ์ที่แปลกประหลาดที่ไดเร็กทอรีที่ไม่ว่างเปล่าไม่สามารถลบได้เนื่องจากผู้ใช้ไม่มีสิทธิ์ในการเขียนและไม่สามารถลบเนื้อหาได้ แต่ถ้าไดเร็กทอรีเดียวกันนั้นว่างเปล่า ผู้ใช้จะสามารถลบได้[ 14 ]
หากไฟล์อยู่ในไดเร็กทอรีที่มี การตั้งค่า sticky bitไว้ การลบไฟล์นั้นจำเป็นต้องให้ผู้ใช้เป็นเจ้าของไฟล์นั้น
ป้องกันการลบโดยไม่ตั้งใจ
คำสั่งดังกล่าวrm -rf *ค่อนข้างมีความเสี่ยง เนื่องจากสามารถลบไฟล์จำนวนมากโดยไม่สามารถกู้คืนได้ คำสั่งเหล่านี้บางครั้งถูกอ้างถึงในเรื่องเล่าเกี่ยวกับความผิดพลาดร้ายแรง[ 15 ]เช่น ในระหว่างการผลิตภาพยนตร์เรื่อง Toy Story 2 [ 16 ]
เพื่อลดความเสี่ยงจากการลบไฟล์โดยไม่ตั้งใจ เทคนิคที่นิยมใช้คือการซ่อนrmคำสั่งเริ่มต้นไว้หลังชื่อย่อหรือฟังก์ชันที่มีตัวเลือกแบบโต้ตอบ ตัวอย่างเช่น:
ชื่อเรียกย่อrm = "rm -i"หรือ
rm () { /bin/rm -i " $@ " ; }โดยค่าเริ่มต้น โปรแกรมrmจะกำหนดให้ผู้ใช้ยืนยันการลบแต่ละไฟล์โดยการกดปุ่มYหรือ+ เพื่อข้ามขั้นตอนการยืนยัน ผู้ใช้สามารถใส่ตัวเลือก (เนื่องจากตัวเลือกที่ระบุไว้ในภายหลังบนบรรทัดคำสั่งที่ขยายแล้ว " " จะมีผลเหนือกว่า) NReturn-frm -i -f
น่าเสียดายที่วิธีนี้อาจนำไปสู่การลบโดยไม่ตั้งใจอื่นๆ เนื่องจากเป็นการฝึกให้ผู้ใช้ไม่ระมัดระวังเกี่ยวกับสัญลักษณ์ตัวแทนที่พวกเขาส่งให้rmรวมถึงกระตุ้นให้ผู้ใช้กดปุ่มและยืนยันโดยไม่คิดไตร่ตรอง ผู้ใช้บางรายถึงกับใช้ปุ่มซึ่งจะยืนยันการลบไฟล์แต่ละไฟล์โดยอัตโนมัติด้วยซ้ำ YReturnyes | rm files
ทางออกที่ประนีประนอมซึ่งอนุญาตให้ผู้ใช้ยืนยันเพียงครั้งเดียว ส่งเสริมการใช้สัญลักษณ์ตัวแทน (wildcard) อย่างถูกต้อง และทำให้การตรวจสอบรายการง่ายขึ้น สามารถทำได้ด้วยวิธีดังต่อไปนี้:
ถ้า[ -n " $PS1 " ] ; แล้ว rm () { ls -FCsd " $@ " echo 'remove[ny]? ' | tr -d '\012' ; อ่านถ้า[ "_ $REPLY " = "_y" ] ; แล้ว /bin/rm -rf " $@ " มิฉะนั้นecho '(ยกเลิก)' fi } fiอาจกล่าวได้ว่า ฟังก์ชันนี้ไม่ควรถูกสร้างเป็นสคริปต์เชลล์เพราะอาจเสี่ยงต่อการถูกค้นพบก่อนระบบrmในเส้นทางการค้นหา และไม่ควรอนุญาตให้ใช้ในเชลล์ที่ไม่ใช่แบบโต้ตอบ เพราะอาจทำให้งานแบบแบตช์เสียหายได้ การใส่คำนิยามไว้ในif [ -n "$PS1" ] ; then .... ; fiโครงสร้างจะช่วยป้องกันปัญหาหลังนี้ได้
คำสั่งอื่นๆ ถูก ออกแบบมาเพื่อป้องกันการลบโดยไม่ตั้งใจ รวมถึงsafe-rm[ 17 ]และtrash[ 18 ]
การปกป้องรูทของระบบไฟล์
rm -rf /หากเรียกใช้คำสั่งนี้โดยผู้ใช้ระดับสูงสุดจะทำให้ไฟล์ทุกไฟล์ในระบบไฟล์ถูกลบ เพื่อความปลอดภัยSun Microsystemsได้แนะนำการป้องกันพิเศษสำหรับคำสั่งนี้ในSolaris 10 (เปิดตัวครั้งแรกในปี 2548) การใช้งานจะรายงานว่า/ไม่อนุญาต ให้ลบ [ 19 ]หลังจากนั้นไม่นาน ฟังก์ชันเดียวกันนี้ก็ถูกนำมาใช้ในการใช้งานFreeBSD [ 20 ]เวอร์ชันGNUจะปฏิเสธการทำงานrm -rf /หาก--preserve-rootมีการรวมตัวเลือก[ 21 ]ซึ่งเป็นค่าเริ่มต้นตั้งแต่เวอร์ชัน 6.4 ของGNU Core Utilitiesในระบบที่ใหม่กว่าระบบป้องกันความผิดพลาด นี้ จะทำงานอยู่เสมอ แม้ว่าจะไม่มีตัวเลือกก็ตาม ในการเรียกใช้คำสั่ง ผู้ใช้ต้องข้ามระบบป้องกันความผิดพลาดโดยการเพิ่มตัวเลือก--no-preserve-rootแม้ว่าพวกเขาจะเป็นผู้ใช้ระดับสูงสุดก็ตาม
ข้อจำกัด
การใช้งาน GNU Core Utilities มีข้อจำกัดเกี่ยวกับอาร์กิวเมนต์บรรทัดคำสั่ง อาร์กิวเมนต์ถูกจำกัดไว้ที่ 32 เท่าของขนาดเพจที่จัดสรรให้กับเคอร์เนล ระบบที่มีขนาดเพจ 4KB จึงจะมีข้อจำกัดขนาดอาร์กิวเมนต์ที่ 128KB [ 22 ]สำหรับอาร์กิวเมนต์บรรทัดคำสั่งก่อนเคอร์เนล 2.6.23 ข้อจำกัดเหล่านี้ถูกกำหนดไว้ในระหว่างการคอมไพล์เคอร์เนลและสามารถแก้ไขได้โดยการเปลี่ยนตัวแปรMAX_ARG_PAGESในinclude/linux/binfmts.hไฟล์[ 23 ] [ 24 ]เคอร์เนลรุ่นใหม่กว่าจำกัดความยาวอาร์กิวเมนต์สูงสุดไว้ที่ 25% ของขีดจำกัดสแต็กสูงสุด (ulimit -s) การเกินขีดจำกัดจะส่งผลให้เกิดข้อผิดพลาด[ 25 ]
ดูเพิ่มเติม
- deltree – คำสั่งใน DOS และ Windows 9x
- dsw (คำสั่ง) – คำสั่งเชลล์ที่ล้าสมัยสำหรับลบไฟล์ที่มีชื่อที่อ่านออกเสียงไม่ได้
อ่านเพิ่มเติม
- McElhearn, Kirk (2006). บรรทัดคำสั่ง Mac OS X: Unix Under the Hood . John Wiley & Sons . ISBN 978-0470113851.
ลิงก์ภายนอก
- : ลบรายการในไดเร็กทอรี – เอกสารอ้างอิงเชลล์และยูทิลิตี้, ข้อกำหนดยูนิกซ์ฉบับเดียว , เวอร์ชัน 5 จากThe Open Group
- – คู่มือโปรแกรมเมอร์Plan 9 เล่ม 1
- – คู่มือคำสั่งทั่วไปของเกม Inferno
สรุปเนื้อหา
ข้อมูลสำคัญจากบทความ
ข้อมูลสำคัญเกี่ยวกับ rm (Unix)
rm ` remove` ซึ่งย่อมาจาก ` remove` เป็น คำสั่ง เชลล์ สำหรับลบไฟล์ (รวมถึง ไฟล์พิเศษ เช่น โฟลเดอร์ ) ออกจาก ระบบไฟล์ คำสั่งนี้อาจไม่ได้ลบไฟล์จริง ๆ...
ประวัติศาสตร์
ในระบบ Unix บางเวอร์ชันเก่า rm คำสั่งจะลบไดเร็กทอรีหากว่างเปล่า [ 6 ] พฤติกรรมนี้ยังคงสามารถทำได้ในบางเวอร์ชัน rm ด้วย -d แฟล็ก เช่น BSD (เช่น FreeBSD [ 7 ] NetBSD [ 8 ] OpenBSD [ 9 ] และ macOS ) ซึ่ง พัฒนา มาจาก 4.4BSD - Lite2
ใช้
โดยค่าเริ่มต้น rm จะลบไฟล์ที่ระบุ แต่จะไม่ลบไดเร็กทอรี [ 12 ] ตัวอย่างเช่น คำสั่งต่อไปนี้จะลบไฟล์ชื่อ foo
สิทธิ์การเข้าถึง
ในระบบไฟล์ส่วนใหญ่ การลบไฟล์จำเป็นต้องมีสิทธิ์ในการเขียนและเรียกใช้งานในไดเร็กทอรีที่เก็บไฟล์นั้น บางคนอาจสับสนว่าสิทธิ์ในไฟล์ที่จะลบนั้นไม่สำคัญ อย่างไรก็ตาม การใช้งาน GNU ยืนยันว่าจะลบไฟล์ที่ป้องกันการเขียนเว้นแต่จะใช้ตัวเลือก -f [ 13 ]