ตราบใดที่คุณไม่ย้ายไฟล์ข้ามเส้นขอบระบบไฟล์การทำงานควรจะปลอดภัย นี่เป็นผลมาจากกลไกการเคลื่อนไหวของ«ทำจริงอย่างไร
หากคุณmv
เป็นไฟล์ในระบบไฟล์เดียวกันไฟล์นั้นจะไม่ได้รับการสัมผัส แต่จะมีการเปลี่ยนแปลงเฉพาะรายการระบบไฟล์เท่านั้น
$ mv foo bar
จริง ๆ แล้วทำสิ่งที่ชอบ
$ ln foo bar
$ rm foo
สิ่งนี้จะสร้างฮาร์ดลิงก์ (รายการไดเร็กทอรีที่สอง) สำหรับไฟล์ (ที่จริงแล้ว inode ที่ชี้โดยรายการระบบไฟล์) foo
ตั้งชื่อbar
และลบfoo
รายการ ตั้งแต่ตอนนี้เมื่อลบfoo
จะมีรายการระบบไฟล์ที่สองชี้ไปfoo
ที่ไอโหนดของการลบรายการเก่าfoo
ไม่ได้ลบบล็อกใด ๆ ที่เป็นของไอโหนด
โปรแกรมของคุณจะต่อท้ายไฟล์อย่างมีความสุขเนื่องจากไฟล์เปิดชี้ไปที่ไอโหนดของไฟล์ไม่ใช่รายการระบบไฟล์
หมายเหตุ:หากโปรแกรมของคุณปิดและเปิดไฟล์ใหม่ระหว่างการเขียนคุณจะต้องสร้างไฟล์ใหม่ด้วยรายการระบบไฟล์เก่า!
การย้ายข้ามระบบไฟล์:
หากคุณย้ายไฟล์ข้ามพรมแดนระบบไฟล์สิ่งต่าง ๆ น่าเกลียด ในกรณีนี้คุณไม่สามารถรับประกันว่าจะมีไฟล์ของคุณทำให้สอดคล้องกันเนื่องจากmv
จะจริง
- สร้างไฟล์ใหม่บนระบบไฟล์เป้าหมาย
- คัดลอกเนื้อหาของไฟล์เก่าไปยังไฟล์ใหม่
- ลบไฟล์เก่า
หรือ
$ cp /path/to/foo /path/to/bar
$ rm /path/to/foo
รับผิดชอบ
$ touch /path/to/bar
$ cat < /path/to/foo > /path/to/bar
$ rm /path/to/foo
ขึ้นอยู่กับว่าการคัดลอกมาถึงจุดสิ้นสุดไฟล์ในระหว่างการเขียนแอปพลิเคชันของคุณหรือไม่อาจเกิดขึ้นได้ว่าคุณมีเพียงครึ่งหนึ่งของบรรทัดในไฟล์ใหม่
นอกจากนี้หากแอปพลิเคชันของคุณไม่ปิดและเปิดไฟล์เก่าอีกครั้งมันจะเขียนต่อไปยังไฟล์เก่าแม้ว่ามันจะถูกลบไปแล้ว: เคอร์เนลรู้ว่าไฟล์ใดบ้างที่เปิดอยู่และแม้ว่ามันจะลบรายการระบบไฟล์ก็ตาม จะไม่ลบ inode ของไฟล์เก่าและบล็อกที่เกี่ยวข้องจนกว่าแอปพลิเคชันของคุณจะปิดการจัดการไฟล์ที่เปิดอยู่
rename()
เรียกระบบ ดังนั้นเวอร์ชันดั้งเดิมของการmv
โทรได้จริงlink()
เพื่อสร้างฮาร์ดลิงก์ตามด้วยunlink()
เพื่อลบชื่อเดิมrename()
ถูกเพิ่มเข้ามาใน FreeBSD เพื่อนำอะตอมนี้ไปใช้ในเคอร์เนล