เป็นไปได้ไหมที่จะเปลี่ยนชื่อไฟล์หรือไดเรกทอรีโดยใช้ inode


10

ฉันเปลี่ยนไดเร็กทอรี / home เป็นพาร์ติชันอื่นและไม่สามารถเข้าถึงไฟล์จากสิ่งที่ฉันสามารถแก้ไขได้จากคำถามนี้คุณจะเข้าถึงเนื้อหาของการเมาต์ก่อนหน้าหลังจากเปลี่ยนเป็นพาร์ติชันอื่นได้อย่างไร .

ในกรณีที่ฉันจดบันทึก inode ของไดเร็กตอรี่ก่อนที่ฉันจะสามารถใช้มันคนเดียวเพื่อเปลี่ยนชื่อไดเรคทอรีได้?

คำตอบ:


6

คุณสามารถเปลี่ยนชื่อไฟล์ (ไดเรกทอรีหรืออะไรก็ตาม) โดยใช้ความรู้เฉพาะของ inode ที่ใช้findแต่ถ้า (a) ระบบไฟล์ที่มีอยู่นั้นไม่ได้ถูกเมาท์หรือถ้า (b) มีระบบไฟล์อื่นติดตั้งอยู่ในไดเรกทอรีที่ไม่ว่างเปล่า ไฟล์ที่คุณสนใจระบบไม่สามารถเข้าถึงไฟล์ของคุณได้ ในกรณี (a) คุณต้องติดตั้งระบบไฟล์ก่อนที่คุณจะสามารถทำอะไรกับเนื้อหารวมถึงการเปลี่ยนชื่อและในกรณี (b) คุณจะต้องยกเลิกการต่อเชื่อมระบบไฟล์ที่ติดตั้ง "ที่ด้านบนของ" ไดเรกทอรีที่มี ไฟล์ที่คุณต้องการเปลี่ยนชื่อ ดูเหมือนว่าคุณกำลังถามเกี่ยวกับกรณีและปัญหา (b)

ถ้าผมเข้าใจคุณอย่างถูกต้องคุณพยายามที่จะทำให้เก่าของคุณ/homeไดเรกทอรี (ซึ่งตั้งอยู่บนพาร์ทิชันรากของคุณ) /homeที่สามารถเข้าถึงได้ในขณะที่ยังคงใช้พาร์ทิชันใหม่ของคุณติดตั้งที่ ถ้านั่นคือสิ่งที่คุณต้องการทำต่อไปนี้:

ปิดไฟล์ทั้งหมดและออกจากระบบ จากนั้นเข้าสู่ระบบในฐานะroot(ใช้เทอร์มินัลเสมือนสำหรับสิ่งนี้ - กด Ctrl-Alt-F2) เรียกใช้สิ่งต่อไปนี้:

umount /home
mv /home /home-old
mkdir /home
mount -a
ls /home
ls /home-old

หากทุกอย่างดีออกจากระบบและกลับเข้าสู่ระบบในฐานะตัวคุณเองและทุกอย่างควรจะดี

อนึ่งคำสั่งในการเปลี่ยนชื่อไฟล์โดยใช้ความรู้เฉพาะของ inode (สมมติว่าไฟล์อยู่ในไดเรกทอรีปัจจุบัน) คือ:

find . -maxdepth 1 -inum 123456789 -exec mv {} mynewname \;

123456789แน่นอนหมายเลขไอโหนดอยู่ที่ไหน (โปรดทราบว่าfindกำหนดชื่อไฟล์และเส้นทางของมันและส่งผ่านข้อมูลนี้ไปmvยังไม่มีทางที่จะเปลี่ยนชื่อไฟล์โดยไม่เกี่ยวข้องกับชื่อไฟล์ที่มีอยู่ในทางใดทางหนึ่ง แต่ถ้ามันเป็นเพียงที่คุณไม่รู้จักชื่อไฟล์มันค่อนข้าง ง่าย.)


คำสั่ง mv สามารถเปลี่ยนชื่อโดยตรงตามไอโหนดหรือไม่? ฉันคิดว่าคำสั่ง find คืนชื่อไฟล์ในรูปแบบข้อความปกติ
vfclists

@vfclists: ไม่mvไม่รับ inodes แต่อย่างใด
Wildcard

6

ในระบบไฟล์ Unix ทั่วไปมันเป็นไปไม่ได้ในเชิงโครงสร้างในการย้ายไฟล์ตาม inode เหตุผลคือการเปลี่ยนชื่อไฟล์หมายถึงการลบรายการไดเรกทอรีจากไดเรกทอรีที่มีมันและสร้างไดเรกทอรีที่อื่น แต่ไอโหนดไม่ได้มีตัวชี้ไปยังรายการไดเรกทอรีมันมีเพียง (ตัวชี้ไปที่) ข้อมูลเมตาของไฟล์ (เวลาประทับสิทธิ์ ฯลฯ ) และเนื้อหาของไฟล์

สำหรับไฟล์ที่มีฮาร์ดลิงก์หลายตัวคุณจะเปลี่ยนชื่อไฟล์ไหน? ไอโหนดไม่เพียงพอสำหรับข้อมูล

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

  1. อ่านเนื้อหาของไดเรกทอรีซึ่งสามารถเข้าถึงได้จาก inode
  2. ..ค้นหารายการไดเรกทอรีสำหรับ ชี้ไปที่ไดเรกทอรีหลัก
  3. ในไดเร็กทอรีพาเรนต์ค้นหารายการไดเร็กทอรีที่มีหมายเลข inode ที่ถูกต้อง

สิ่งนี้ทำให้หลายสมมติฐานอย่างไรก็ตาม:

  • เกิดอะไรขึ้นถ้ามีหลายรายการสำหรับ inode เดียวกัน? ที่จริงแล้วมันไม่ใช่ปัญหา: ที่จะเกิดขึ้นในทางปฏิบัติแทบจะไม่เคยเนื่องจากตัวแปร unix ส่วนใหญ่ห้ามการเชื่อมโยงไปยังไดเรกทอรีที่ชัดเจนยาก
  • ไม่..อยู่ในสถานที่แรก? ขึ้นอยู่กับประเภทของระบบไฟล์ ระบบไฟล์บางระบบมีรายการที่ชัดเจนสำหรับ..; สำหรับคนอื่น ๆ รายการเหล่านี้ถูกแกล้งโดยไดรเวอร์ระบบไฟล์ หาก..ไม่มีอยู่วิธีนี้เป็นไปไม่ได้โดยพื้นฐาน
  • แม้ว่าระบบไฟล์จะมี..ลิงก์อยู่ แต่ก็มีบล็อกอื่นที่สะดุดซึ่งอาจไม่ชัดเจน: ขั้นตอนที่ 1 อาจเป็นไปได้ภายในเคอร์เนล แต่ไม่มีอินเทอร์เฟซสำหรับมัน ตัวแปรยูนิกซ์หลายตัวไม่มีอินเตอร์เฟสที่อนุญาตให้เปิดไฟล์ผ่าน inode เนื่องจากมันจะข้ามการอนุญาต ตัวอย่างเช่นไฟล์ที่มีสิทธิ์rwxr-xr-x(เช่นอ่านได้ทั่วโลก) ที่อยู่ในไดเรกทอรีที่มีสิทธิ์rwx------(เช่นเข้าถึงได้เฉพาะเจ้าของเท่านั้น) นั้นไม่สามารถเข้าถึงได้ทุกคนยกเว้นเจ้าของไดเรกทอรี ไม่สามารถกำหนดได้จาก inode เพียงอย่างเดียว - ไฟล์สามารถเข้าถึงได้ผ่านการเชื่อมโยงฮาร์ดอื่น!

ผลที่สุดคือไม่มันเป็นไปไม่ได้ที่จะทำอะไรรวมถึงการเปลี่ยนชื่อด้วยไฟล์ที่ให้ inode เท่านั้น คุณต้องมีเส้นทางไปยังไฟล์

วิธีปฏิบัติที่เป็นประโยชน์เพียงอย่างเดียวในการดำเนินการกับไฟล์ที่กำหนดให้ inode คือการหาเส้นทางตัวอย่างเช่นfind -inumจากนั้นใช้เส้นทางเพื่อดำเนินการ ที่ไม่ได้ช่วยในสถานการณ์ของคุณที่ไฟล์เงาโดยจุดเชื่อมต่อ ไม่มีวิธีการพกพาในการเข้าถึงไฟล์ที่บังด้วยจุดเมานท์ บน Linux ตามที่คุณค้นพบคุณสามารถใช้การเชื่อมต่อเชื่อม


-1

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

you-get -O 20191129_tucker https://www.youtube.com/watch?v=cyCpkwX9Wvs

... ให้ไฟล์กับฉัน:

20191129_tucker.webm; และ "ออมทักเกอร์คาร์ลสันคืนนี้ 11-29-19 เต็ม - ข่าวฟ็อกซ์ทำลาย 29 พฤศจิกายน 2019.en.srt"

ฉันคิดว่านี่เป็นข้อบกพร่องของประโยชน์ที่คุณจะได้รับ

ฉันสามารถเปลี่ยนชื่อไฟล์ที่สองดังนี้:

$ ls -il "Saving Tucker Carlson คืนนี้ 11-29-19 เต็ม - Breaking Fox News วันที่ 29 พฤศจิกายน 2019.en.srt"

... นี่ให้รายชื่อไฟล์ที่มีหมายเลขไอโหนดในตอนเริ่มต้น:

13902671 -rw-r - r-- 1 james james 55793998 30 พ.ย. 18:44 Saving Tucker Carlson คืนนี้ 11-29-19 FULL- Breaking Fox News 29 พฤศจิกายน 2019.en.srt

... จากนั้นฉันก็วิ่ง:

mvi 13902671 20191129_tucker.srt

สคริปต์ mash bash shell ของฉันคือ:

#!/bin/bash
inodeNumber=$1
newFileName=$2
find . -maxdepth 1 -inum $inodeNumber -exec mv {} $newFileName \;

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