![Заменить указанные файлы на символические ссылки](https://rvso.com/image/1438158/%D0%97%D0%B0%D0%BC%D0%B5%D0%BD%D0%B8%D1%82%D1%8C%20%D1%83%D0%BA%D0%B0%D0%B7%D0%B0%D0%BD%D0%BD%D1%8B%D0%B5%20%D1%84%D0%B0%D0%B9%D0%BB%D1%8B%20%D0%BD%D0%B0%20%D1%81%D0%B8%D0%BC%D0%B2%D0%BE%D0%BB%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B5%20%D1%81%D1%81%D1%8B%D0%BB%D0%BA%D0%B8.png)
У меня есть git-репозиторий, с которым я работаю, в котором есть файлы и папки, которые нужно сделать символическими ссылками на файлы и папки внутри другой папки. Все символические ссылки указаны в виде текста во второй папке проектов. Я просто хочу узнать, как пройти и автоматически настроить все символические ссылки.
Пример структуры
project1/
---- myfile.rb
---- myfolder/
project2/
---- myfile.rb
---- myfolder
и в файлепроект2/мойфайл.rbон включает только следующий текст в строке 1.
../project1/myfile.rb
ипроект2/мояпапкавключает только текст
../project1/myfolder
Это повторяется по всей структуре файла. Другой пример:
проект2/app.rbимеет текст
../project2/app.rb
Я работаю в Ubuntu и думаю, что есть способ пройти по ним автоматически и установить символические ссылки, а не искать каждую из них вручную.
решение1
Не то чтобы git мог версионировать симлинки, поэтому рассмотрите версионирование симлинков, а не таких файлов. Также вы можете рассмотреть подмодули git, чтобы между двумя репозиториями была реальная связь.
Если я правильно понял ваш вопрос/настройку, это может сработать. Он ищет файлы (рекурсивно) в папке ./project2
с количеством строк, равным одной, и заменяет каждый из этих файлов ссылкой на файл, указанный там, при условии, что цель существует.
#!/bin/bash
for file in $(find project2/ -type f )
do
linecount=$(wc -l $file | awk '{print $1}')
if [ $linecount -eq 1 ]; then
target=$(cat $file)
relTarget=$(dirname $file)/$target
if [ -f $relTarget ] || [ -d $relTarget ]; then
rm $file
ln -s $target $file
fi
fi
done
решение2
Запустите следующую команду из вашего project2
каталога:
for file in *; do
link="$(cat "$file")"
rm "$file"
ln -s "$link" "$file"
done
Это не рекурсивно, поэтому подкаталоги не просматриваются.