Цель заменить симлинки на реальные файлы. Когда это необходимо? Когда нужно избавиться от симлинков, заменив их исходными файлами, на которые они указывают. Это может быть нужно когда мы переносим наши файлы на другой носитель или в другую локацию

Команда которая делает это:

find . -type l -exec cp --remove-destination $(readlink -f {}) {} \;

Разбор:

  1. find . -type l:

    • Находит все символические ссылки (-type l) в текущем каталоге (.) и его подкаталогах.
  2. -exec ... \;:

    • Выполняет указанную команду (cp --remove-destination $(readlink -f {}) {}) для каждого найденного элемента.
  3. readlink -f {}:

    • Возвращает абсолютный путь к файлу, на который указывает символическая ссылка {}.
  4. cp --remove-destination $(readlink -f {}) {}:

    • Копирует реальный файл, на который указывает символическая ссылка ($(readlink -f {})), обратно в ту же позицию, где находится символическая ссылка ({}).
    • Опция --remove-destination удаляет целевой файл перед копированием. Это важно, чтобы заменить символическую ссылку реальным файлом (иначе cp не сможет записать поверх ссылки).

Что происходит в итоге:

  • Символические ссылки заменяются их целевыми файлами.
  • Это полезно, если вы хотите избавиться от символических ссылок, заменив их содержимым файлов, на которые они указывают.

Пример:

  • Пусть у вас есть структура:

    ./file.txt
    ./link -> file.txt

    После выполнения команды:

    find . -type l -exec cp --remove-destination $(readlink -f {}) {} \;

    структура станет:

    ./file.txt
    ./link (это больше не ссылка, а копия file.txt)