Я хотел бы рекурсивно преобразовывать мягкие ссылки в жесткие ссылки в каталоге. Я пробовал что-то вроде этого:
for f in *; do (mv $f{,~} && ln $(readlink $f~) && rm $f~) done
... но у него есть две основные проблемы:
- не рекурсивный
- подбирает файлы, которые не являются символическими ссылками
Было бы неплохо как-то прокормить вышеприведенную строку find -type l
, но я не уверен, как это сделать.
bash
find
symbolic-link
Аттила О.
источник
источник
cp -aH
). [1]: unix.stackexchange.com/questions/94185/…Ответы:
Эта команда должна работать:
Как это работает:
find -type l
находит все ссылки в текущем каталоге.-exec bash -c '...' {} \;
вызывает bash для выполнения...
.Он передает
{}
- имя ссылки, которая в данный момент обрабатывается - как аргумент, к которому bash может получить доступ как$0
.readlink -m "$0"
возвращает абсолютный путь к месту назначения символической ссылки.ln -f "$(readlink -m "$0")" "$0"
перезаписывает (-f
) символическую ссылку$0
жесткой ссылкой на свою цель.Если ссылка не может быть преобразована по какой-либо причине, она останется нетронутой, и ln выведет сообщение об ошибке.
источник
bash
иln
?-e
переключатель исправляет это.brew install coreutils
аfind * -type l -exec bash -c 'ln -f "$(greadlink -m "$0")" "$0"' {} \;
.