Чистый bash и coreutils, изменяет символические ссылки на относительные без лишних ../
s в пути:
find. -type l | while read l; do
target="$(realpath "$l")"
ln -fs "$(realpath --relative-to="$(dirname "$(realpath -s "$l")")" "$target")" "$l"
done
Вы можете изменить:
find.
в find /path/to/directory
для преобразования символических ссылок в этом каталоге ln -fs
по echo ln -fs
для пробного прогона Пояснение:
target="$(realpath "$l")"
-находит абсолютный путь к цели символической ссылки ln -fs
-создает символическую ссылку (-s
), заставляя(-f
)перезаписывать существующие realpath -s "$l"
-находит абсолютный путь к самой символической ссылке dirname "$(realpath -s "$l")"
-находит абсолютный путь к каталогу, содержащему символическую ссылку realpath --relative-to="$(dirname "$(realpath -s "$l")")" "$target"
-находит путь к цели относительно символической ссылки, другими словами :преобразует абсолютный путь в относительный Ваши команды также выводят файлы, на доступ к которым у текущего пользователя нет прав.
Несколько более коротким решением было бы
locate -0b '\python' | perl -0nE 'say if -f'
, но не печатает недоступные -файлы.
Вы также можете использовать bash для циклического просмотра файлов, но это немного более подробно:
locate -0b '\python' | while IFS= read -d '' -r f ; do
[[ -f $f ]] && printf '%s\n' "$f"
done