Einfachste Möglichkeit, symbolische Links in Textdateien umzuwandeln?
1451
congusbongus
Ich hatte Ordner mit vielen symbolischen Links. Leider haben sie sich nach dem Kopieren verschiedener Dateisysteme in reine Textdateien mit dem Linkziel als Inhalt verwandelt. Das ist:
Vor
$ ll link ... link -> /path/to/target
Nach dem
$ cat link /path/to/target
Wie kann ich diesen Link am einfachsten wiederherstellen? Vielleicht ein Einzeiler oder ein Shell-Skript.
Angenommen, ich hatte Hunderte solcher Links. Gibt es eine Möglichkeit, sie alle wiederherzustellen, ohne dass der Fix manuell für jeden Link ausgeführt werden muss?
Machen Sie es sich mit `debugfs` bequem. Versuche nicht * zu * viel Schaden zu verursachen ...
Ignacio Vazquez-Abrams vor 11 Jahren
0
`debugfs` ist hier absolut nicht das richtige Werkzeug.
wingedsubmariner vor 11 Jahren
0
Aus Neugier, welche Dateisysteme haben Sie zwischen kopiert und welche Tools haben Sie verwendet?
wingedsubmariner vor 11 Jahren
0
2 Antworten auf die Frage
1
wingedsubmariner
Verwenden Sie diesen Befehl:
ls *txt | xargs -I R1 sh -c "cat R1 | xargs -I R2 ln -sf R2 R1"
Durch ls *txtetwas ersetzen, das die Liste der Textdateien ausgibt, die symbolische Links sein sollen. Beispielsweise find . -name "*txt"würden alle * txt-Dateien in oder unter dem aktuellen Verzeichnis aufgeführt.
1
Emil Vatai
Versuche dies:
ls * | while read f; do ln -sf "$(cat $f)" "$f" done
Wie in wingedsubmariners Antwort ls *sollte durch etwas ersetzt werden, das genau die Dateien enthält, die Sie wollten.
Ich finde das
ls * | while read f; do # command executed for each file done
konstruieren sehr nützlich. Wie ich weiß, ist dies der richtige Weg, um alle Dateinamen zu behandeln. Wenn beispielsweise ein Dateiname Leerzeichen enthält, funktioniert "$ f" immer noch (im Gegensatz zu for f in $(ls *); do...done).
FYI: $ (cmd) ist das gleiche wie, cmdaber anders als `` kann es geschachtelt werden.