Рекурсивно символическое дерево каталогов

Я пытаюсь запустить рекурсивную символическую ссылку из одного каталога в другой:

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 "$@"

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

Другие вопросы по тегам