1

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

До

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

После

$ cat link
/path/to/target

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

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

2 ответа2

1

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

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

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

1

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

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 но может быть вложенным в отличие от ``.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .