È possibile rinominare un file o una directory usando l'inode?


Risposte:


6

Puoi rinominare un file (directory o altro) usando solo la conoscenza dell'inode usando find, ma se (a) il filesystem che lo contiene non è montato, o se (b) c'è un altro filesystem montato su una directory non vuota che contiene il file che ti interessa, semplicemente il file non è accessibile dal tuo sistema. Nel caso (a), è necessario montare il filesystem prima di poter fare qualsiasi cosa sul contenuto, incluso rinominare, e nel caso (b), è necessario smontare il filesystem che è montato "sopra la" directory che contiene il file che si desidera rinominare. Sembra che tu stia chiedendo del caso (b).

Se ti capisco correttamente, stai cercando di rendere /homeaccessibile la tua vecchia directory (che si trova sulla tua partizione di root), mentre usi ancora la tua nuova partizione montata su /home. Se è quello che vuoi, procedi come segue:

Chiudi tutti i file e disconnettiti. Quindi accedi come root(usa un terminale virtuale per questo — premi Ctrl-Alt-F2) Esegui quanto segue:

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

Se tutto va bene, disconnettiti e riconnettiti come te stesso e tutto dovrebbe andare bene.

Per inciso, il comando per rinominare un file usando solo la conoscenza del suo inode (supponendo che il file sia nella directory corrente) è:

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

Dov'è 123456789il numero dell'inode, ovviamente. (Nota che finddetermina il nome del file e il suo percorso e passa queste informazioni a mv; non c'è alcun modo per rinominare un file senza coinvolgere il nome file esistente in alcun modo, ma se è solo che non conosci il nome file, è abbastanza semplice.)


Il comando mv può rinominare direttamente in base all'inode? Presumo che il comando find restituisca il nome file nella sua normale forma testuale.
vfclists

@vfclists: No, mvnon accetta inode in alcun modo.
Carattere jolly

6

In un tipico filesystem Unix, è strutturalmente impossibile in generale spostare un file basato sull'inode. Il motivo è che rinominare un file significa rimuovere la sua voce di directory dalla directory che lo contiene e creare una directory altrove. Ma l'inode non contiene un puntatore alla voce della directory, contiene solo (puntatori a) i metadati del file (timestamp, autorizzazioni, ecc.) E il contenuto del file.

Per un file con più collegamenti fissi, quale di questi rinomineresti? L'inode non è abbastanza informazioni.

Per una directory, su alcuni filesystem, sarebbe possibile agire dato l'inode da solo:

  1. Leggi il contenuto della directory, che è sicuramente raggiungibile dall'inode.
  2. Individua la voce della directory per ... Questo punta alla directory principale.
  3. Nella directory principale, cercare una voce di directory con il numero di inode corretto.

Questo fa diverse ipotesi, tuttavia:

  • Cosa succede se sono presenti più voci per lo stesso inode? In realtà, questo non è un problema: ciò non accadrà quasi mai in pratica poiché la maggior parte delle varianti unix proibiscono collegamenti espliciti alle directory.
  • Esiste ..in primo luogo? Questo dipende dal tipo di filesystem. Alcuni filesystem hanno una voce esplicita per ..; per altri, queste voci sono simulate dal driver del filesystem. Se ..non esiste, questo approccio è fondamentalmente impossibile.
  • Anche se il filesystem include ..collegamenti, c'è un altro ostacolo che potrebbe non essere ovvio: il passaggio 1 potrebbe essere possibile all'interno del kernel, ma non esiste un'interfaccia per esso. Molte varianti di unix non hanno un'interfaccia che consente l'apertura di un file tramite il suo inode, poiché ciò aggirerebbe le autorizzazioni. Ad esempio, un file con autorizzazioni rwxr-xr-x(cioè leggibile in tutto il mondo) che si trova in una directory con autorizzazioni rwx------(cioè accessibile solo al suo proprietario) non è accessibile a nessuno, ma al proprietario della directory. Questo non può essere determinato dal solo inode - il file potrebbe effettivamente essere accessibile tramite un altro collegamento reale!

Il risultato è che no, non è possibile fare nulla, incluso rinominare, con un file dato solo il suo inode. Devi avere un percorso per il file.

L'unico modo pratico per agire su un file dato il suo inode è prima trovare un percorso, per esempio con find -inum, e quindi usare il percorso per agire. Ciò non aiuta nella tua situazione, in cui il file è ombreggiato da un punto di montaggio. Non esiste un modo portatile per accedere ai file ombreggiati da un mount point; su Linux, come hai scoperto, puoi usare un mount bind.


-1

Grazie. Questo è stato di grande aiuto. Mi permette di cambiare nomi ingombranti per la trascrizione di file video che ho scaricato da YouTube in nomi di file più concisi ma ancora significativi. Per esempio:

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

... mi dà i file:

20191129_tucker.webm; e "Salvare Tucker Carlson Tonight dal 29 al 29 novembre FULL- Breaking Fox News 29 novembre 2019.en.srt"

Ritengo che questo sia un difetto del altrimenti molto utile che ottieni.

Posso cambiare il secondo nome del file come segue:

$ ls -il "Salvare Tucker Carlson Tonight 11-29-19 FULL- Breaking Fox News 29 novembre 2019.en.srt"

... questo mi dà l'elenco dei file con il suo numero di inode proprio all'inizio:

13902671 -rw-r - r-- 1 james james 55793998 30 nov 18:44 Saving Tucker Carlson Tonight 11-29-19 FULL- Breaking Fox News 29 novembre 2019.en.srt

... poi corro:

mvi 13902671 20191129_tucker.srt

Il mio script mvi bash shell è:

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

Ciò non aggiunge alcuna nuova informazione oltre a quanto precedentemente menzionato. Inoltre, il tuo mviscript utilizza variabili non quotate, il che significa che fallirà se uno qualsiasi degli argomenti forniti allo script contiene caratteri di spazi bianchi (o potenzialmente anche quando contengono caratteri globbing).
Kusalananda
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.