Il modo più semplice per ripristinare i collegamenti simbolici trasformati in file di testo?


1

Ho avuto cartelle con molti link simbolici in loro. Sfortunatamente dopo averlo copiato su diversi filesystem, sono diventati semplici file di testo con il link target come contenuto. Questo è:

Prima

$ ll link
... link -> /path/to/target

Dopo

$ cat link
/path/to/target

Qual è il modo più semplice per ripristinare questo link? Forse un one-liner o uno script di shell.

Supponiamo di avere centinaia di link come questo, c'è un modo per ripristinarli tutti, senza eseguire manualmente la correzione su ognuno di essi?


Mettiti comodo debugfs. Cerca di non causare pure molto danno ...
Ignacio Vazquez-Abrams

debugfs non è assolutamente lo strumento giusto da usare qui.
wingedsubmariner

Per curiosità, quali filesystem hai copiato e quali strumenti hai usato?
wingedsubmariner

Risposte:


1

Usa questo comando:

ls *txt | xargs -I R1 sh -c "cat R1 | xargs -I R2 ln -sf R2 R1"

Sostituire ls *txt con qualcosa che produrrà l'elenco di file di testo che dovrebbero essere link simbolici. Per esempio, find . -name "*txt" elencherebbe tutti i file * txt nella o nella directory corrente.


1

Prova questo:

ls * | while read f; do
  ln -sf "$(cat $f)" "$f" 
done

come nella risposta di wingedsubmariner, ls * dovrebbe essere sostituito con qualcosa che elencherà esattamente i file che volevi.

Io trovo il

ls * | while read f; do
  # command executed for each file
done

costruire molto utile. Come so, questo è il modo giusto per gestire tutti i nomi di file, ad es. se il nome di un file ha spazi, "$ f" funzionerà ancora (a differenza di for f in $(ls *); do...done ).

A proposito: $ (cmd) è lo stesso di cmd ma può essere nidificato a differenza di ``.

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.