Каталог make в UNIX, который, по-видимому, содержит содержимое других каталогов

3

Если у меня есть 2 каталога, a и b, может кто-нибудь предложить удобный способ создания каталога, в котором, как представляется, содержится содержимое как a, так и b, без копирования файлов? На данный момент я использую ln -s * для загрузки ссылок sym, а затем удаляю ссылки sym, когда я закончу. Я бы предпочел, чтобы, если содержимое подкаталогов оказалось объединенным, и управление этим методом sym link может потребовать некоторых усилий.

Это нормально, если результирующий каталог доступен только для чтения в приложении.

camelccc
источник
Разве вы не можете просто поставить ссылку на сам каталог вместо всего его содержимого? Т.е. ln -s a/ bсоздаст символическую директорию, bкоторая указывает на a.
Даниэль Андерссон
1
@Daniel Andersson Это не создаст каталог, показывающий объединенное содержимое a и b, что и было вопросом вопроса.
camelccc
Это вроде нетривиально. Как объединить коллизии для файлов, содержащихся как в a, так и в b? Каково ваше намерение? Вы можете попытаться жестко связать файлы из a и b с другим каталогом c, чтобы получать обновления файлов при изменении в обоих каталогах.
p4553d
Я знаю, что это нетривиально, я бы хотел, чтобы коллизии появлялись в объединенном каталоге. Я не вижу, как жесткое связывание помогает вообще по сравнению с мягким связыванием, и оно не будет работать, если a и b находятся на разных дисках.
camelccc
Какую ОС / дистрибутив вы используете?
Деннис

Ответы:

4

Вы можете эффективно объединить каталоги с UnionFS , наложив два каталога (в данном контексте называемые ветвями) в одну точку монтирования.

Есть несколько реализаций UnionFS; UnionFsFuse является одним из более простых, так как это приложение (а не патч ядра).

На сайте есть ссылка на их архив. Компиляция исходного кода должна быть простой в большинстве дистрибутивов.

Например, в Ubuntu достаточно установить пакет unionfs-fuse , выполнив следующую команду:

sudo apt-get install unionfs-fuse

После установки вы можете перейти к наложению каталогов. Есть множество вариантов. Я кратко объясню самые основные из них:

  • Команда

    unionfs-fuse foo:bar baz
    

    Наложение содержимого каталогов foo и bar в каталог баз . 1

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

    Столкновения обрабатываются фиксированным образом: если файл существует в более высокой ветви ( foo ), он будет иметь преимущество перед файлом с тем же именем в нижней ветви ( столбце ).

  • Команда

    union-fuse foo=RW:bar=RO baz
    

    делает foo доступным для записи и bar (только для чтения). Модификация файлов foo будет возможна, но модификация файлов бара не будет. Все вновь созданные файлы в базе появятся в foo .

  • Команда

    union-fuse -ocow foo=RW:bar=RO baz
    

    похоже на последнюю команду. Опция copy on write ( cow) приводит к тому, что попытка изменить файл bar внутри baz приведет к измененной копии файла в foo (или любой другой ветке для записи более высокого уровня).

  • С помощью команды

    union-fuse foo=RW:bar=RW baz
    

    все можно изменить. Новые файлы будут созданы в верхней ветке ( foo ).

  • Команда

    union-fuse foo=RO:bar=RW baz
    

    позволяет изменять файлы bar внутри baz , но новые файлы создавать нельзя.

  • Команда

    sudo umount baz
    

    отменяет монтирование

Смотрите также: man unionfs-fuse


1 baz должен существовать до выполнения этой команды. Это относится и ко всем дальнейшим командам.

Деннис
источник