Рекурсивно символическое дерево каталогов
Я пытаюсь запустить рекурсивную символическую ссылку из одного каталога в другой:
find data/* -type d -exec ln -s {} current/{} \;
С одним дополнением: мне нужно скинуть data/
из префикса.
Запуск на сервере OS X (10.8, Mountain Lion)- не все стандартные команды GNU, такие как cp -rs
, поддерживаются.
Что я имею в виду под рекурсивно:
data
список постоянных каталогов между выпусками Laravel:
data/
\ storage/
- framework/
- session/
- app/
\ logs/
Они должны сопоставить с:
current/
\ storage/
- framework
- session/
- app/
- logs/
# Also in storage, but we do NOT want to persist
- debugbar/
- framework/
- cache/
- views/
наш data
каталог будет постоянным хранилищем между запусками приложений, так как мы обновляем наш сайт, сохраняя предыдущие версии сайта в случае отката (current
случается, мягкая ссылка на последний выпуск).
Примечание: у нас также есть другие сайты, кроме Laravel. data
будет нашим стандартом, и мы будем сопоставлять реструктуризацию каталогов в зависимости от того, что сайт требует для сохранения. Это не всегда будет data/storage
,
3 ответа
Вам не нужно делать никакой рекурсии. После того, как вы связались с каталогом, все файлы и каталоги в нем доступны по ссылке.
Единственные ссылки, которые вам нужны - это каталоги верхнего уровня...
cd current
ln -s ../data/*/ .
Или, в зависимости от ваших требований, сделать current
ссылка на data
может быть даже достаточно.
Уложить GNU. https://www.gnu.org/software/stow/
Пытаться:
# cd to dir above ./data
mkdir datalinks
stow -d datalinks data
Stow будет разумно работать с существующими файлами в исходном каталоге. Если dit не существует, он создаст символическую ссылку на каталог, но если это так, он будет символизировать содержимое.
Требуется время, чтобы разобраться в этом, но как только вы это сделаете, это откроет новый взгляд на управление файлом / символической ссылкой. Подумайте о малонаселенном дереве, где только новые файлы являются фактическими файлами, а все остальное является символической ссылкой на то, что было раньше - и у вас есть машина времени Apple. Если вы когда-либо просматривали резервную копию машины времени из оболочки, вы увидите, что она идентична резервной копии rsnapshot. Все основано на редких древовидных символических ссылках, из которых уложен швейцарский армейский нож.
Я отвечаю о том, как рекурсивно связать все файлы из одного каталога в другой.
Мне это было нужно, и я не мог найти хороших решений для macOS
.
Следующее - лучшее решение, если оно доступно:
cp -Rs <src_dir> <dest_dir>
В противном случае я сделал следующее:
#! /usr/bin/env bash
symlink_recursive_copy() {
local src_dir=$1 ; shift
local target_dir=$1
local basename
local cdir
local full_path_cdir
local full_path_target_dir
local opwd=$PWD
if [ -e "$target_dir" ]
then
>&2 echo "$target_dir already exists"
return 1
fi
target_dir="$opwd/${target_dir##*/}"
cd "$src_dir"
while IFS= read -r -d '' file
do
basename="${file##*/}"
cdir="${file%/*}"
cd "$cdir" ; full_path_cdir=$PWD ; cd "$OLDPWD"
mkdir -p "$target_dir/$cdir"
ln -s "$full_path_cdir/$basename" "$target_dir/$cdir/$basename"
done < <( find . -type f -print0 )
cd "$opwd"
}
symlink_recursive_copy "$@"
Вышеупомянутое должно работать с любыми типами файлов, содержащих символы новой строки, пробелы, кавычки, завершающие символы новой строки и т. Д.