Самый простой способ восстановить символические ссылки, превращенные в текстовые файлы?

1419
congusbongus

У меня были папки со многими символическими ссылками в них. К сожалению, после копирования этого вокруг различных файловых систем, они превратились в простые текстовые файлы с целевым объектом ссылки в качестве содержимого. То есть:

До

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

После

$ cat link /path/to/target 

Какой самый простой способ восстановить эту ссылку? Возможно, однострочник или сценарий оболочки.

Предположим, у меня было сотни таких ссылок, есть ли способ восстановить их все без ручного запуска исправления для каждой из них?

1
Получите удобство с `debugfs`. Старайтесь не наносить * слишком * большой ущерб ... Ignacio Vazquez-Abrams 11 лет назад 0
`debugfs` - совершенно не тот инструмент, который можно использовать здесь. wingedsubmariner 11 лет назад 0
Из любопытства, какие файловые системы вы копировали, и какие инструменты вы использовали? wingedsubmariner 11 лет назад 0

2 ответа на вопрос

1
wingedsubmariner

Используйте эту команду:

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

Замените ls *txtчто-нибудь, что выведет список текстовых файлов, которые должны быть символическими ссылками. Например, find . -name "*txt"будет список всех * TXT файлов в или под текущим каталогом.

1
Emil Vatai

Попробуй это:

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

как в ответе wingedsubmariner, ls * следует заменить что-то, что будет перечислять именно те файлы, которые вы хотели.

Я нахожу

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

Конструкция очень полезна. Как я знаю, это правильный способ обработки всех имен файлов, например, если в имени файла есть пробелы, тогда $ f будет работать (в отличие от for f in $(ls *); do...done).

К вашему сведению: $ (cmd) - это то же самое, cmdно может быть вложенным в отличие от ``.

Похожие вопросы