İnode kullanarak bir dosyayı veya dizini yeniden adlandırmak mümkün mü?


Yanıtlar:


6

Bir dosyayı (dizin veya herhangi bir şeyi) yalnızca inode bilgisini kullanarak yeniden adlandırabilirsiniz find, ancak (a) içeren dosya sistemi bağlı değilse veya (b) boş olmayan bir dizin üzerine monte edilmiş başka bir dosya sistemi varsa ilgilendiğiniz dosyaya sisteminiz tarafından erişilemez. (A) durumunda, yeniden adlandırma dahil olmak üzere içeriğe herhangi bir şey yapmadan önce dosya sistemini bağlamanız gerekir ve (b) durumunda, dosyayı içeren dizinin "üstüne" monte edilmiş dosya sistemini çıkarmanız gerekir. yeniden adlandırmak istediğiniz dosyayı seçin. Görünüşe göre dava (b).

Sizi doğru anlıyorsam, eski /homedizininizi (kök bölümünüzde bulunan) erişilebilir hale getirmeye çalışıyorsunuz ve hala yeni bölümünüzü monte edilmiş halde kullanıyorsunuz /home. İstediğiniz buysa, aşağıdakileri yapın:

Tüm dosyaları kapatın ve oturumu kapatın. Sonra olarak oturum açın root(bunun için sanal bir terminal kullanın - Ctrl-Alt-F2 tuşlarına basın) Aşağıdakileri çalıştırın:

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

Her şey yolundaysa, kendiniz gibi oturumu kapatın ve tekrar oturum açın; her şey yolunda olmalıdır.

Bu arada, bir dosyayı yalnızca inode bilgisini kullanarak yeniden adlandırma komutu (dosyanın geçerli dizinde olduğu varsayılarak):

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

123456789Elbette inode numarası nerede . ( findDosya mvadını ve yolunu belirleyen ve bu bilgiyi şu adrese aktacağını unutmayın ; mevcut dosya adını herhangi bir şekilde içermeden bir dosyayı yeniden adlandırmanın bir yolu yoktur, ancak yalnızca dosya adını bilmiyorsanız , basit.)


Mv komutu doğrudan inode'a göre yeniden adlandırabilir mi? Find komutunun dosya adını normal metin biçiminde döndürdüğünü varsayıyorum.
vfclists

@vfclists: Hayır, mvhiçbir şekilde inode kabul etmeyecek.
Wildcard

6

Tipik bir Unix dosya sisteminde, genel olarak inode temelli bir dosyayı taşımak yapısal olarak imkansızdır. Bunun nedeni, bir dosyayı yeniden adlandırmak, dizin girişini, onu içeren dizinden kaldırmak ve başka bir yerde bir dizin oluşturmak anlamına gelir. Ancak inode, dizin girişine bir işaretçi içermez, yalnızca dosya meta verilerini (zaman damgaları, izinler, vb.) Ve dosya içeriğini (işaretçiler) içerir.

Birden çok sabit bağlantı içeren bir dosya için, bunlardan hangilerini yeniden adlandırırsınız? İnode yeterli bilgi değil.

Bir dizin için, bazı dosya sistemlerinde, yalnızca inode verildiğinde işlem yapmak mümkün olacaktır:

  1. Kesinlikle inode'dan erişilebilen dizinin içeriğini okuyun.
  2. İçin dizin girişini bulun ... Bu üst dizine işaret eder.
  3. Üst dizinde, doğru inode numarasına sahip bir dizin girişi arayın.

Ancak bu birkaç varsayım yapar:

  • Aynı inode için birden fazla giriş varsa ne olur? Aslında, bu bir sorun değil: çoğu unix varyantı dizinlere açık sabit bağlantıları yasakladığı için uygulamada neredeyse hiç olmayacak.
  • Does ..ilk etapta mevcut? Bu, dosya sistemi türüne bağlıdır. Bazı dosya sistemlerinde açık bir giriş vardır ..; diğerleri için bu girdiler dosya sistemi sürücüsü tarafından taklit edilir. Eğer ..yoksa, bu yaklaşım temel olarak imkansızdır.
  • Dosya sistemi ..bağlantılar içeriyor olsa bile, belirgin olmayabilecek başka bir engel var: adım 1 çekirdek içinde mümkün olabilir, ancak bunun için bir arayüz yok. Birçok unix varyantı, bir dosyanın inode'u yoluyla açılmasına izin veren hiçbir arabirime sahip değildir, çünkü bu izinleri atlar. Örneğin, izinleri rwxr-xr-xolan bir dizinde bulunan rwx------(yani yalnızca sahibinin erişebildiği ) izinlere sahip bir dosya (örneğin, dünya tarafından okunabilir) , dizin sahibi dışında kimseye erişemez. Bu yalnızca inode'dan belirlenemez - dosyaya başka bir sabit bağlantı üzerinden erişilebilir!

Sonuçta, hayır, sadece inode verilen bir dosya ile yeniden adlandırma da dahil olmak üzere hiçbir şey yapmak mümkün değildir. Dosya için bir yol olması gerekir.

İnode verildiğinde bir dosya üzerinde işlem yapmanın tek pratik yolu, önce bir yol bulmak, örneğin ile find -inumhareket etmektir. Bu, dosyanın bir bağlama noktası tarafından gölgelendiği durumda size yardımcı olmaz. Bir bağlama noktasının gölgesindeki dosyalara erişmenin taşınabilir bir yolu yoktur; Linux'ta, keşfettiğiniz gibi, bir bağlama aparatı kullanabilirsiniz.


-1

Teşekkür ederim. Bu çok yardımcı oldu. YouTube'dan indirdiğim video dosyalarının konuşma metni için hantal isimleri daha özlü ama yine de anlamlı dosya adlarına değiştirmeme izin veriyor. Örneğin:

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

... bana dosyaları veriyor:

20191129_tucker.webm; ve "Tucker Carlson Tonight'ı Kaydetme 11-29-19 FULL - Breaking Fox News 29 Kasım 2019.en.srt"

Bunun, aksi takdirde çok faydalı olmanın bir eksikliği olduğunu düşünüyorum.

İkinci dosya adını aşağıdaki gibi değiştirebilirim:

$ ls -il "Tasarruf Tucker Carlson Tonight 11-29-19 FULL- Breaking Fox News 29 Kasım 2019.en.srt"

... bu bana başlangıçta inode numarası ile dosya listesini veriyor:

13902671 -rw-r - r-- 1 james james 55793998 30 Kasım 18:44 Tucker Carlson'ı Tasarruf Bu Gece 11-29-19 FULL- Breaking Fox News 29 Kasım 2019.en.srt

... sonra koşarım:

mvi 13902671 20191129_tucker.srt

Benim mvi bash kabuk betiği:

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

Bu, daha önce bahsedilenlerin ötesinde yeni bir bilgi eklemez. Ayrıca, mvikomut dosyanız tırnaksız değişkenler kullanır, yani komut dosyasına verilen bağımsız değişkenlerden herhangi biri boşluk karakterleri içeriyorsa (ya da potansiyel karakterler de içerdiğinde) başarısız olur.
Kusalananda
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.