GNU/Linux >> Linux Esercitazione >  >> Linux

Convertire un collegamento fisico in un collegamento simbolico?

È facile convertire un collegamento simbolico in un collegamento reale con ln -f (esempio)

Sarebbe anche facile convertire un hardlink (filenames link e original ) torna a un collegamento simbolico a link->original nel caso in cui conosci entrambi i file e definisci tu stesso quale è il "file originale". Potresti facilmente creare un semplice script convert-known-hardlink-to-symlink ciò risulterebbe in qualcosa del tipo:

convert-known-hardlink-to-symlink link original
$ ls -li
3802465 lrwxrwxrwx 1 14 Dec  6 09:52 link -> original
3802269 -rw-rw-r-- 1  0 Dec  6 09:52 original

Ma sarebbe davvero utile se avessi uno script in cui potresti definire una directory di lavoro (predefinito ./ ) e una directory di ricerca in cui cercare (predefinito / ) per i file con lo stesso inode e quindi convertire tutti quei collegamenti fisici in collegamenti simbolici.

Il risultato sarebbe che nella directory di lavoro definita tutti i file che sono collegamenti fisici vengono invece sostituiti con collegamenti simbolici al primo file trovato con lo stesso inode.

Un inizio sarebbe find . -type f -links +1 -printf "%i: %p (%n)n"

Risposta accettata:

Ho creato uno script che farà questo. Lo script converte tutti i collegamenti reali che trova in una directory di origine (primo argomento) che sono gli stessi della directory di lavoro (secondo argomento opzionale) in collegamenti simbolici:

https://gist.github.com/rubo77/7a9a83695a28412abbcd

Ha un'opzione -n ​​per una prova a secco, che non fa altro che mostra cosa sarebbe stato fatto.

Parte principale:

$WORKING_DIR=./
#relative source directory from working directory:
$SOURCE_DIR=../otherdir/with/hard-links/with-the-same-inodes

# find all files in WORKING_DIR
cd "$WORKING_DIR"
find "." -type f -links +1 -printf "%i %pn" | 
  while read working_inode working_on
do
    find "$SOURCE_DIR" -type f -links +1 -printf "%i %pn" | sort -nk1 | 
      while read inode file
    do
        if [[ $inode == $working_inode ]]; then
            ln -vsf "$file" "$working_on"
        fi
    done
done

The -links +1 –> Troverà tutti i file che hanno PIÙ di 1 collegamento. I file con collegamento fisico hanno un numero di collegamenti di almeno due.


Linux
  1. Converti la chiave privata Openssh in una chiave privata Ssh2?

  2. Come comprimere un collegamento simbolico?

  3. Converti l'output ls in csv

  4. Come rimuovere un collegamento simbolico a una directory?

  5. I file di collegamento simbolico sopravvivono a SVN?

Converti la tua installazione di Windows in una VM su Linux

Comando Ln:come creare collegamenti simbolici in Linux

Comando Ln in Linux (Crea collegamenti simbolici)

Come creare un collegamento simbolico in Linux usando il comando Ln

Guida all'aggiunta di collegamenti simbolici Linux

Come convertire le immagini in formato ASCII in Linux