Apakah mungkin untuk mengganti nama file atau direktori menggunakan inode?


Jawaban:


6

Anda dapat mengganti nama file (direktori atau apa pun) hanya menggunakan pengetahuan inode menggunakan find, tetapi jika (a) filesystem yang berisi itu tidak di-mount, atau jika (b) ada filesystem lain yang dipasang di atas direktori non-kosong yang berisi file yang Anda minati, file tersebut tidak dapat diakses oleh sistem Anda. Dalam hal (a), Anda perlu me-mount sistem file sebelum Anda dapat melakukan apa saja untuk konten, termasuk mengubah nama, dan dalam kasus (b), Anda perlu meng-unmount sistem file yang dipasang "di atas" direktori yang berisi file yang ingin Anda ganti namanya. Sepertinya Anda bertanya tentang kasus (b).

Jika saya mengerti Anda dengan benar, Anda mencoba membuat /homedirektori lama Anda (yang terletak di partisi root Anda) dapat diakses, sementara masih menggunakan partisi baru Anda yang terpasang di /home. Jika itu yang Anda inginkan, lakukan hal berikut:

Tutup semua file dan keluar. Kemudian masuk sebagai root(gunakan terminal virtual untuk ini — tekan Ctrl-Alt-F2) Jalankan yang berikut:

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

Jika semuanya baik-baik saja, keluar dan masuk kembali seperti dirimu sendiri dan semuanya akan baik-baik saja.

Secara kebetulan, perintah untuk mengganti nama file hanya menggunakan pengetahuan inode-nya (dengan asumsi file ada di direktori saat ini) adalah:

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

Di mana 123456789nomor inode, tentu saja. (Catatan yang findmenentukan nama file dan jalurnya dan meneruskan info ini ke mv; tidak ada cara sama sekali untuk mengubah nama file tanpa melibatkan nama file yang ada dengan cara apa pun, tetapi jika hanya karena Anda tidak tahu nama file, itu cukup sederhana.)


Bisakah perintah mv mengganti nama secara langsung berdasarkan inode? Saya berasumsi bahwa perintah find mengembalikan nama file dalam bentuk teks normal.
vfclists

@vfclists: Tidak, mvtidak akan menerima inode dengan cara apa pun.
Wildcard

6

Dalam sistem file Unix yang khas, secara struktural tidak mungkin secara umum untuk memindahkan file berdasarkan inode. Alasannya adalah bahwa mengubah nama file berarti menghapus entri direktori dari direktori yang berisi itu, dan membuat direktori di tempat lain. Tetapi inode tidak mengandung pointer ke entri direktori, itu hanya berisi (menunjuk ke) metadata file (cap waktu, izin, dll.) Dan isi file.

Untuk file dengan banyak tautan keras, yang mana yang akan Anda ganti namanya? Inode tidak cukup informasi.

Untuk direktori, pada beberapa sistem file, dimungkinkan untuk bertindak mengingat inode saja:

  1. Baca konten direktori, yang pasti dapat dijangkau dari inode.
  2. Cari entri direktori untuk ... Ini menunjuk ke direktori induk.
  3. Di direktori induk, cari entri direktori dengan nomor inode kanan.

Namun, ini membuat beberapa asumsi:

  • Bagaimana jika ada beberapa entri untuk inode yang sama? Sebenarnya, itu bukan masalah: itu hampir tidak pernah terjadi dalam praktik karena sebagian besar varian unix melarang tautan keras eksplisit ke direktori.
  • Apakah ..ada di tempat pertama? Ini tergantung pada tipe sistem file. Beberapa sistem file memiliki entri eksplisit untuk ..; bagi yang lain, entri ini dipalsukan oleh driver sistem file. Jika ..tidak ada, pendekatan ini pada dasarnya tidak mungkin.
  • Sekalipun filesystem menyertakan ..tautan, ada batu sandungan lain yang mungkin tidak jelas: langkah 1 mungkin ada di dalam kernel, tetapi tidak ada antarmuka untuk itu. Banyak varian unix tidak memiliki antarmuka yang memungkinkan membuka file melalui inode-nya, karena itu akan memotong izin. Misalnya, file dengan izin rwxr-xr-x(yaitu dapat dibaca dunia) yang terletak di direktori dengan izin rwx------(yaitu hanya dapat diakses oleh pemiliknya) tidak dapat diakses oleh siapa pun selain pemilik direktori. Ini tidak dapat ditentukan hanya dari inode - file tersebut sebenarnya dapat diakses melalui tautan keras lain!

Hasilnya adalah tidak, tidak mungkin melakukan apa pun, termasuk mengganti nama, dengan file yang hanya diberikan inode-nya. Anda harus memiliki jalur ke file.

Satu-satunya cara praktis untuk bertindak pada file yang diberikan inode adalah pertama-tama menemukan jalur, misalnya dengan find -inum, dan kemudian menggunakan jalur untuk bertindak. Itu tidak membantu dalam situasi Anda, di mana file dibayangi oleh mount point. Tidak ada cara portabel untuk mengakses file yang dibayangi oleh mount point; di Linux, seperti yang Anda temukan, Anda dapat menggunakan bind mount.


-1

Terima kasih. Ini sangat membantu. Ini memungkinkan saya untuk mengubah nama rumit untuk transkrip file video yang saya unduh dari YouTube menjadi nama file yang lebih ringkas namun masih bermakna. Sebagai contoh:

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

... memberi saya file:

20191129_tucker.webm; dan "Saving Tucker Carlson Malam Ini 11-29-19 FULL- Breaking Fox News 29 November 2019.en.srt"

Saya menganggap ini sebagai kekurangan dari yang Anda dapatkan sangat berguna.

Saya dapat mengubah nama file kedua sebagai berikut:

$ ls -il "Menyimpan Tucker Carlson Malam Ini 11-29-19 FULL- Breaking Fox News 29 November 2019.en.srt"

... ini memberi saya daftar file dengan nomor inode tepat di awal:

13902671 -rw-r - r-- 1 james james 55793998 30 Nov 18:44 Menyimpan Tucker Carlson Malam Ini 11-29-19 PENUH- Breaking Fox News 29 November 2019.en.srt

... lalu saya jalankan:

mvi 13902671 20191129_tucker.srt

Script mvi bash shell saya adalah:

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

Ini tidak menambahkan informasi baru apa pun di luar apa yang telah disebutkan sebelumnya. Selain itu, mviskrip Anda menggunakan variabel yang tidak dikutip yang artinya akan gagal jika salah satu argumen yang diberikan pada skrip berisi karakter spasi putih (atau berpotensi juga ketika mengandung karakter globbing).
Kusalananda
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.