20

Я хотел бы рекурсивно преобразовывать мягкие ссылки в жесткие ссылки в каталоге. Я пробовал что-то вроде этого:

for f in *; do (mv $f{,~} && ln $(readlink $f~) && rm $f~) done

... но у него есть две основные проблемы:

  • не рекурсивный
  • подбирает файлы, которые не являются символическими ссылками

Было бы неплохо как-то накормить вышеприведенную строку, чтобы find -type l , но я не уверен, как это сделать.

1 ответ1

29

Эта команда должна работать:

find -type l -exec bash -c 'ln -f "$(readlink -m "$0")" "$0"' {} \;

Как это устроено:

  • find -type l находит все ссылки в текущем каталоге.

  • -exec bash -c '...' {} \; вызывает bash для выполнения ...

    Он проходит {} - имя ссылки, которая в данный момент обрабатывается & dash; в качестве аргумента, bash может получить доступ как $0 .

  • readlink -m "$0" возвращает абсолютный путь к месту назначения символической ссылки.

  • ln -f "$(readlink -m "$0")" "$0" перезаписывает (-f) символическую ссылку $0 жесткой ссылкой на свою цель.

Если ссылка не может быть преобразована по какой-либо причине, она останется нетронутой, и ln выведет сообщение об ошибке.

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