1

Windows 1803, 7z 18.05

Попытка заархивировать и сжать структуру папок с несколькими NTFS-соединениями, ссылающимися на части указанной структуры (т.е. без "внешних" ссылок) - есть ли возможность сжимать структуру без 7zip разрешения разрешающих узлов, что приводит к дублированию?

Сохранение соединений было бы аккуратным, архивирование соединений как пустых папок также было бы приемлемым, но размер архива имеет абсолютный приоритет.

Выбор tar или wim качестве формата имеет опции для символических ссылок NTFS, но, похоже, не включает сжатие (в качестве уровня сжатия представлено только store ) - впоследствии мне придется сжимать, что кажется ненужным промежуточным шагом.

Я мог бы удалить узлы перед архивированием, но я бы предпочел не делать этого, если это возможно.

2 ответа2

2

Я бы предложил пойти в два этапа:

  1. Создайте список всех соединений в папке
  2. Создайте архив 7Zip из папки, исключая файлы из списка.

Для первого шага вы можете использовать следующую команду в командной строке:

dir /AL /S /B your-folder > exclude.txt

Куда :

  • /A отображает все файлы с определенным атрибутом, а L указывает точки повторной обработки (символические ссылки и соединения каталогов)
  • /S делает команду рекурсивной
  • /B указывает только формат имен файлов.

При архивировании папки используйте ключ -x (Исключить имена файлов) :

7z a archive.7z folder\ -xr@exclude.txt
0

Дополняя ответ @harrymc и отвечая на ваши потребности: «Сохранение переходов было бы аккуратным, архивирование переходов в виде пустых папок также было бы приемлемым, но размер архива имеет абсолютный приоритет». Вы можете сохранить свои соединения в виде простых текстовых файлов, а затем 7zip с -xr@exclude.txt как предложено @harrymc. Таким образом, вы удовлетворяете обоим требованиям за счет создания "фальшивого" файла .junction в том же месте назначения вашего узла.

Вам нужно будет рекурсивно следовать всем соединениям и для каждого извлекать имя подстановки и сохранять его в файл.

for /d /r %%a in (%1\*) do if exist %%a\nul call :storejunction "%%~dpnxa"
goto :eof

:storejunction
set attribs=%~a1
if not "%attribs:~-1%" == "l" goto :eof
for /f "tokens=3*" %%b in ('junction %~s1 ^| find "Substitute Name:"') do set "jname=%%b"
echo %jname% >"%~f1.junction"
goto :eof

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .