7-Zip отключить рекурсию для папок, которые соответствуют *. * - PullRequest
2 голосов
/ 22 марта 2020

Я использую 7-Zip 19.00 64-bit. Я хочу сжать файлы в папке, но исключить подкаталоги; отключить рекурсивный.

Команда, которую я выполняю:

7z u -mx9 -r- -bd wwwroot.7z C:\inetpub\wwwroot\*.*

C: \ inetpub \ wwwroot \, будет содержать подкаталоги, названные в честь доменов.

C:\inetpub\wwwroot\domain.com (directory)
C:\inetpub\wwwroot\domain.org (directory)
C:\inetpub\wwwroot\domain.net (directory)
C:\inetpub\wwwroot\images (directory)
C:\inetpub\wwwroot\javascript (directory)
C:\inetpub\wwwroot\index.html
C:\inetpub\wwwroot\robots.txt
C:\inetpub\wwwroot\favicon.ico

7-Zip включает подкаталоги, соответствующие шаблону; domain.com, domain.org, domain. net будут в wwwroot.7z. изображениях и javascript будут исключены. index. html, robots.txt и favicon.ico будут в wwwroot.7z, как и ожидалось.

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

Я пытался использовать следующее, и ни одна из них не работает так, как я хочу:

7z u -mx9 -r- -bd wwwroot.7z C:\inetpub\wwwroot\.
7z u -mx9 -r- -bd wwwroot.7z C:\inetpub\wwwroot\

Я искал в документации способы исключения по атрибуту но не смог найти его. Я посмотрел на параметр -x, но, похоже, он применим только к файлам.

Система, на которой я работаю, это Windows Server 2012 R2.

@ Mofi : wwwroot.7z должен содержать только файлы, без подкаталогов.

Чтобы выполнить sh эту задачу с WinRAR, я бы использовал эту команду:

rar u -ma5 -m5 -ep1 C:\inetpub\wwwroot\wwwroot.rar C:\inetpub\wwwroot\*.*

Ответы [ 2 ]

2 голосов
/ 23 марта 2020

Решение для сжатия нерекурсивных только файлов в указанном каталоге в 7-Zip архив:

7z.exe u -mx9 -bd -x!*\ -- wwwroot.7z C:\inetpub\wwwroot\*

Переключатель -x!*\ приводит к e x , включая все каталоги в каталоге C:\inetpub\wwwroot и все файлы в этих каталогах. 7-Zip даже не пытается получить доступ к одному из подкаталогов при использовании этого переключателя, как это видно с помощью бесплатного инструмента Sysinternals (Microsoft) Process Monitor .

Подстановочный знак * вместо *.* используется для сжатия в файл архива также файлов без расширения файла. Страница справки 7-Zip Синтаксис командной строки объясняет разницу между * и *.* по сравнению с Windows, который интерпретирует *.* всегда как *. WinRAR интерпретирует *.*, также отличающийся от *, как 7-Zip, и поэтому также отличается от Windows.

Примечание: Я не понимаю, почему переключатель по умолчанию -r- даже при явном использовании в командной строке не приводит к игнорированию всех файлов во всех подкаталогах, как следует в соответствии с пояснениями на странице справки -r (Подкаталоги Recurse) включает при использовании 7-Zip 19.00 (x86) или версия x64). -r- работает с использованием *.txt вместо *. Таким образом, похоже, что поведение при добавлении файлов в подкаталогах при использовании шаблона подстановки * или *.* с использованием неявного значения по умолчанию -r- или при явном указании этого переключателя в командной строке является либо ошибкой 7-Zip 19.00 или неадекватное документированное поведение, если намеренно умышленно.

1 голос
/ 22 марта 2020
@echo off
setlocal

set "target=C:\inetpub\wwwroot"

dir /b /a-d "%target%\*" > "%cd%\include.tmp"

pushd "%target%\" && (
    call 7z u -mx9 -bd "%cd%\wwwroot.7z" -ir0@"%cd%\include.tmp"
    popd
)

del "%cd%\include.tmp"

Файл списка может быть создан с выводом dir, который может дать список только файлов. pushd в целевой каталог и запустите 7z. Значение %cd% останется таким же, поскольку не используется отложенное расширение, т. Е. С !cd!. Если вам нужен каталог скриптов вместо текущего каталога, замените %cd% на %~dp0.

Файл списка может дать вам гибкость, которая вам может понадобиться.

...