Có thể đổi tên một tập tin hoặc thư mục bằng cách sử dụng inode?


10

Tôi đã thay đổi thư mục / home thành một phân vùng khác và không thể truy cập các tệp từ nó, một điều tôi đã có thể giải quyết từ câu hỏi này - Làm thế nào để bạn truy cập vào nội dung của mount trước đó sau khi chuyển sang phân vùng khác? .

Trong trường hợp tôi đã lưu ý inode của thư mục trước đây tôi có thể sử dụng nó một mình để đổi tên thư mục không?

Câu trả lời:


6

Bạn có thể đổi tên một tệp (thư mục hoặc bất cứ thứ gì) chỉ sử dụng kiến ​​thức về inode bằng cách sử dụng find, nhưng nếu (a) hệ thống tệp chứa nó không được gắn kết, hoặc nếu (b) có một hệ thống tệp khác được gắn trên một thư mục không trống có chứa tập tin bạn quan tâm, tập tin của bạn không thể truy cập được. Trong trường hợp (a), bạn cần gắn hệ thống tập tin trước khi bạn có thể làm bất cứ điều gì với nội dung, bao gồm đổi tên và trong trường hợp (b), bạn cần ngắt kết nối hệ thống tập tin được gắn "trên đầu" của thư mục chứa tập tin bạn muốn đổi tên. Có vẻ như bạn đang hỏi về trường hợp (b).

Nếu tôi hiểu bạn một cách chính xác, bạn đang cố gắng làm cho /homethư mục cũ của bạn (nằm trên phân vùng gốc của bạn) có thể truy cập được, trong khi vẫn sử dụng phân vùng mới được gắn tại /home. Nếu đó là những gì bạn muốn, hãy làm như sau:

Đóng tất cả các tập tin và đăng xuất. Sau đó đăng nhập với tư cách root(sử dụng thiết bị đầu cuối ảo cho điều này, nhấn Ctrl-Alt-F2) Chạy như sau:

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

Nếu tất cả đều ổn, hãy đăng xuất và đăng nhập lại với tư cách là chính mình và tất cả sẽ ổn.

Ngẫu nhiên, lệnh đổi tên một tệp chỉ sử dụng kiến ​​thức về inode của nó (giả sử tệp nằm trong thư mục hiện tại) là:

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

Trong trường hợp 123456789là số inode, tất nhiên. (Lưu ý rằng findxác định tên tệp và đường dẫn của nó và chuyển thông tin này đến mv; không có cách nào để đổi tên một tệp mà không liên quan đến tên tệp hiện có theo bất kỳ cách nào, nhưng nếu bạn không biết tên tệp thì hoàn toàn không biết đơn giản.)


Lệnh mv có thể đổi tên trực tiếp dựa trên inode không? Tôi giả sử rằng lệnh find trả về tên tệp ở dạng văn bản thông thường.
vfclists

@vfclists: Không, mvsẽ không chấp nhận inodes theo bất kỳ cách nào.
tự đại diện

6

Trong một hệ thống tệp Unix điển hình, nói chung về mặt cấu trúc không thể di chuyển một tệp dựa trên nút. Lý do là việc đổi tên một tệp có nghĩa là loại bỏ mục nhập thư mục của nó khỏi thư mục chứa nó và tạo một thư mục ở nơi khác. Nhưng inode không chứa con trỏ đến mục nhập thư mục, nó chỉ chứa (con trỏ tới) siêu dữ liệu tệp (dấu thời gian, quyền, v.v.) và nội dung tệp.

Đối với một tệp có nhiều liên kết cứng, bạn sẽ đổi tên trong số này? Các nút không đủ thông tin.

Đối với một thư mục, trên một số hệ thống tập tin, có thể hành động được cung cấp inode một mình:

  1. Đọc nội dung của thư mục, chắc chắn có thể truy cập từ inode.
  2. Xác định vị trí mục nhập cho ... Điều này trỏ đến thư mục cha.
  3. Trong thư mục cha, hãy tìm một mục nhập thư mục với số inode bên phải.

Điều này làm cho một số giả định, tuy nhiên:

  • Điều gì nếu có nhiều mục cho cùng một nút? Trên thực tế, đó không phải là vấn đề: điều đó hầu như không xảy ra trong thực tế vì hầu hết các biến thể unix đều cấm các liên kết cứng rõ ràng đến các thư mục.
  • ..tồn tại ở nơi đầu tiên? Điều này phụ thuộc vào loại hệ thống tập tin. Một số hệ thống tập tin có một mục rõ ràng cho ..; đối với những người khác, các mục này được làm giả bởi trình điều khiển hệ thống tập tin. Nếu ..không tồn tại, phương pháp này về cơ bản là không thể.
  • Ngay cả khi hệ thống tập tin bao gồm ..các liên kết, vẫn có một khối vấp ngã khác có thể không rõ ràng: bước 1 có thể có thể bên trong kernel, nhưng không có giao diện cho nó. Nhiều biến thể unix không có giao diện cho phép mở tệp qua inode của nó, vì điều đó sẽ bỏ qua các quyền. Ví dụ: một tệp có quyền rwxr-xr-x(tức là có thể đọc được trên thế giới) nằm trong thư mục có quyền rwx------(chỉ có thể truy cập đối với chủ sở hữu của nó) không thể truy cập được cho bất kỳ ai trừ chủ sở hữu thư mục. Điều này không thể được xác định từ inode một mình - tập tin thực sự có thể truy cập được thông qua một liên kết cứng khác!

Kết quả cuối cùng là không, không thể làm bất cứ điều gì, kể cả đổi tên, với một tệp chỉ được cung cấp inode của nó. Bạn cần phải có một đường dẫn đến tập tin.

Cách thực tế duy nhất để hành động trên một tệp được cung cấp inode của nó là trước tiên tìm một đường dẫn, ví dụ với find -inum, sau đó sử dụng đường dẫn để hành động. Điều đó không giúp ích gì trong tình huống của bạn, nơi tập tin bị che khuất bởi một điểm gắn kết. Không có cách di động để truy cập các tập tin bị che khuất bởi một điểm gắn kết; trên Linux, như bạn đã phát hiện ra, bạn có thể sử dụng một liên kết gắn kết.


-1

Cảm ơn bạn. Điều này đã được hữu ích nhất. Nó cho phép tôi thay đổi tên rườm rà để sao chép các tệp video mà tôi đã tải xuống từ YouTube thành các tên tệp ngắn gọn hơn nhưng vẫn có ý nghĩa. Ví dụ:

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

... đưa cho tôi các tập tin:

20191129_tucker.webm; và "Cứu Tucker Carlson Tối nay 11-29-19 ĐẦY ĐỦ- Tin tức về Fox ngày 29 tháng 11 năm 2019.en.srt"

Tôi coi đây là một thiếu sót của những gì bạn rất hữu ích.

Tôi có thể thay đổi tên tệp thứ hai như sau:

$ ls -il "Cứu Tucker Carlson Tối nay 11-29-19 FULL- Tin tức Fox mới nhất ngày 29 tháng 11 năm 2019.en.srt"

... điều này mang lại cho tôi danh sách tập tin với số inode của nó ngay khi bắt đầu:

13902671 -rw-r - r-- 1 james james 55793998 30 tháng 11 18:44 Cứu Tucker Carlson Tối nay 11-29-19 FULL- Tin tức Fox mới 29 tháng 11 năm 2019.en.srt

... Sau đó tôi chạy:

mvi 13902671 20191129_tucker.srt

Kịch bản shell mvi bash của tôi là:

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

Điều này không thêm bất kỳ thông tin mới ngoài những gì đã đề cập trước đó. Hơn nữa, mvitập lệnh của bạn sử dụng các biến không được trích dẫn, điều đó có nghĩa là nó sẽ thất bại nếu bất kỳ đối số nào được cung cấp cho tập lệnh chứa các ký tự khoảng trắng (hoặc có khả năng cả khi chúng chứa các ký tự toàn cục).
Kusalananda
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.