Цель заменить симлинки на реальные файлы. Когда это необходимо? Когда нужно избавиться от симлинков, заменив их исходными файлами, на которые они указывают. Это может быть нужно когда мы переносим наши файлы на другой носитель или в другую локацию
Команда которая делает это:
find . -type l -exec cp --remove-destination $(readlink -f {}) {} \;Разбор:
-
find . -type l:- Находит все символические ссылки (
-type l) в текущем каталоге (.) и его подкаталогах.
- Находит все символические ссылки (
-
-exec ... \;:- Выполняет указанную команду (
cp --remove-destination $(readlink -f {}) {}) для каждого найденного элемента.
- Выполняет указанную команду (
-
readlink -f {}:- Возвращает абсолютный путь к файлу, на который указывает символическая ссылка
{}.
- Возвращает абсолютный путь к файлу, на который указывает символическая ссылка
-
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)