กลับไปหน้าบทความ

อ่าน 6 นาที

rm (Unix)

rm ` remove` ซึ่งย่อมาจาก ` remove` เป็น คำสั่ง เชลล์ สำหรับลบไฟล์ (รวมถึง ไฟล์พิเศษ เช่น โฟลเดอร์ ) ออกจาก ระบบไฟล์ คำสั่งนี้อาจไม่ได้ลบไฟล์จริง ๆ...

rm (Unix)

อาร์เอ็ม
ผู้เขียนต้นฉบับเคน ทอมป์สัน , เดนนิส ริทชี ( เอทีแอนด์ที เบลล์ แล็บโบราทอรีส์ )
นักพัฒนานักพัฒนาซอฟต์แวร์โอเพนซอร์สและเชิงพาณิชย์หลายราย
ปล่อย3 พฤศจิกายน 2514 ( 3 พฤศจิกายน 1971 )
เขียนเป็นซี
ระบบปฏิบัติการยูนิก , ระบบปฏิบัติการคล้ายยูนิก , 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.
ดึงข้อมูลมาจาก " https://en.wikipedia.org/w/index.php?title=Rm_(Unix)&oldid=1355223383 "

สรุปเนื้อหา

ข้อมูลสำคัญจากบทความ

ข้อมูลสำคัญเกี่ยวกับ 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 ]