mlocate :как печатать только файлы

Чистый 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"-находит путь к цели относительно символической ссылки, другими словами :преобразует абсолютный путь в относительный
2
01.10.2020, 01:00
1 ответ

Ваши команды также выводят файлы, на доступ к которым у текущего пользователя нет прав.

Несколько более коротким решением было бы

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
3
18.03.2021, 23:01

Теги

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