Добавить каждый файл в отдельный архив
У меня есть много файлов с одним и тем же именем во многих папках в проекте на ПК с Windows. В тысячах папок находятся сотни тысяч исходных файлов.
Я не могу бросить их в zip-файл - для этого нужны уникальные имена.
Я попытался использовать Agent Ransack, который перечислит все файлы по их путям, но, к сожалению, 7Zip игнорирует пути и жалуется на отсутствие уникальных имен.
Что мне нужно, это сценарий или автоматизированный способ получить только определенные файлы свойств в соответствующих папках в ZIP-архив. Затем они могут быть разархивированы прямо над существующими, когда они возвращаются в одной операции тоже.
1 ответ 1
выходил бы и брал все файлы с расширением .cpp внутри и под DIR1 и помещал их в архив с именем project.zip. Затем добавьте больше файлов с расширением .abc в этот архив с помощью
-t указывает тип архива (ZIP). -I и -r переключатели объединены в -ir , которые я ncludes имен файлов и R ecurses подкаталогов. Подстановочные знаки или имена файлов с пробелами должны быть заключены в кавычки, например "Dir\Program files *" или Dir\"Program files" *
Вы также можете создать список файловых спецификаций для включения с подстановочными знаками, а затем поместить только эти файлы в архив с помощью:
Поскольку вы использовали непротиворечивые и уникальные соглашения об именах для файлов исходного кода, вы можете исключить ненужные файлы из архива во время создания с помощью флага -x, например:
который сгенерирует архив, исключая файлы, оканчивающиеся на .src
Файл справки, включенный в 7-zip, к которому вы можете получить доступ из GUI-версии приложения, содержит гораздо больше деталей и много других переключателей.
Если бы это не было так огромно, я мог бы вместо этого предложить использовать 7z из командной строки, чтобы смести все, а затем удалить исходный код из архива перед передачей.
добавляет все файлы и подпапки в и подкаталог папки в архиве archive1.zip. Спецификации файлов в архиве будут содержать subdir\ prefix.
Конфигурация компьютера | |
Процессор: Dual Core 2.6 Mhz | |
Материнская плата: BIOSTAR H61ML | |
Память: DDR3 2Gb | |
HDD: StoreJet Transcend | |
Видеокарта: Intel Corporation Sandy Bridge Integrated Graphics Controller | |
Звук: HDA Intel PCH | |
Монитор: PHILIPS | |
ОС: Linux Mint 9 Rosinka x86 Kernel:3.1.0-0301rc10-generic | |
Прочее: USB wi-fi TP-link TL series |
Здравствуйте. Подскажите пожалуйста каким образом можно заархивировать все файлы в текущей папке в отдельные архивы?
Например папка Documents содержит 5 файлов и нужно получить 5 архивов.Формат архивов и архиватор роли не играют, имя архива должно повторять имя файла. Была уже Похожая тема но мне нужен Bat'ник.
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.
Конфигурация компьютера | |
Процессор: Dual Core 2.6 Mhz | |
Материнская плата: BIOSTAR H61ML | |
Память: DDR3 2Gb | |
HDD: StoreJet Transcend | |
Видеокарта: Intel Corporation Sandy Bridge Integrated Graphics Controller | |
Звук: HDA Intel PCH | |
Монитор: PHILIPS | |
ОС: Linux Mint 9 Rosinka x86 Kernel:3.1.0-0301rc10-generic | |
Прочее: USB wi-fi TP-link TL series |
для 7z можно так
for %%i in (%_in%\*.*) do "%_arcpath%\7z" a "%_out%\%%~ni.7z" "%%i"
Если что не понятно, можно посмотреть здесь Каждый файл в отдельный архив
for %%i in (%_in%\*.*) do "%_arcpath%\7z" a "%_out%\%%~ni.7z" "%%i"
это просто отлично, а как быть чтоб он упаковывал каталоги можно по списку, можно и все что есть в текущем каталоге
чтобы скрипт рекурсивно упаковывал каталоги, нужно добавить ключик -r » |
это я так понимаю
set _in=d:\1
set _out=d:\2
set _arcpath=c:\Program Files\7-zip
for %%i in (%_in%\*) do "%_arcpath%\7z" a -r "%_out%\%%~ni.7z" "%%i"
каталоги не берет в расчет (
необходимо было чуточку по другому
всем спасибо
for /d %%i in (%_in%\*) do "%_arcpath%\7z" a "%_out%\%%~ni.7z" "%%i"
Прошу помочь так как не разбираюсь в вопросе.
Есть:
- каталог с вложенными каталогами в которых файлы fb2.
- WinRar с настроенным профилем архивирования - отдельно создает zip архив для каждого файла и удаляет исходный файл.
Нужно: Рекурсивно проверить все вложенные папки, выделить файлы, запустить упаковку WinRar-ом.
Беда в том что папок несколько тысяч и ручками слишком долго заходить в каждую.
Хотелось бы батник который сможет это сделать.
Не очень понял, что Вам надо.
Скрипт просматривает указанную папку с подпапками Dir
Ищет файлы по указанной маске /b /s /a:-d
Архивирует в фоновом режиме -ibck каждый файл отдельно в zip в указанную папку -afzip
В архиве путь файла исключается -ep
Исходные файлы удаляются -df
При совпадении имён файлов заархивированным останется один из них.
-------
Даже самая сложная проблема обязательно имеет простое, лёгкое для понимания, неправильное решение. Каждое решение плодит новые проблемы.
Конфигурация компьютера | |
Процессор: Dual Core 2.6 Mhz | |
Материнская плата: BIOSTAR H61ML | |
Память: DDR3 2Gb | |
HDD: StoreJet Transcend | |
Видеокарта: Intel Corporation Sandy Bridge Integrated Graphics Controller | |
Звук: HDA Intel PCH | |
Монитор: PHILIPS | |
ОС: Linux Mint 9 Rosinka x86 Kernel:3.1.0-0301rc10-generic | |
Прочее: USB wi-fi TP-link TL series |
Здравствуйте. Подскажите пожалуйста каким образом можно заархивировать все файлы в текущей папке в отдельные архивы?
Например папка Documents содержит 5 файлов и нужно получить 5 архивов.Формат архивов и архиватор роли не играют, имя архива должно повторять имя файла. Была уже Похожая тема но мне нужен Bat'ник.
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.
Конфигурация компьютера | |
Процессор: Dual Core 2.6 Mhz | |
Материнская плата: BIOSTAR H61ML | |
Память: DDR3 2Gb | |
HDD: StoreJet Transcend | |
Видеокарта: Intel Corporation Sandy Bridge Integrated Graphics Controller | |
Звук: HDA Intel PCH | |
Монитор: PHILIPS | |
ОС: Linux Mint 9 Rosinka x86 Kernel:3.1.0-0301rc10-generic | |
Прочее: USB wi-fi TP-link TL series |
для 7z можно так
for %%i in (%_in%\*.*) do "%_arcpath%\7z" a "%_out%\%%~ni.7z" "%%i"
Если что не понятно, можно посмотреть здесь Каждый файл в отдельный архив
for %%i in (%_in%\*.*) do "%_arcpath%\7z" a "%_out%\%%~ni.7z" "%%i"
это просто отлично, а как быть чтоб он упаковывал каталоги можно по списку, можно и все что есть в текущем каталоге
чтобы скрипт рекурсивно упаковывал каталоги, нужно добавить ключик -r » |
это я так понимаю
set _in=d:\1
set _out=d:\2
set _arcpath=c:\Program Files\7-zip
for %%i in (%_in%\*) do "%_arcpath%\7z" a -r "%_out%\%%~ni.7z" "%%i"
каталоги не берет в расчет (
необходимо было чуточку по другому
всем спасибо
for /d %%i in (%_in%\*) do "%_arcpath%\7z" a "%_out%\%%~ni.7z" "%%i"
Прошу помочь так как не разбираюсь в вопросе.
Есть:
- каталог с вложенными каталогами в которых файлы fb2.
- WinRar с настроенным профилем архивирования - отдельно создает zip архив для каждого файла и удаляет исходный файл.
Нужно: Рекурсивно проверить все вложенные папки, выделить файлы, запустить упаковку WinRar-ом.
Беда в том что папок несколько тысяч и ручками слишком долго заходить в каждую.
Хотелось бы батник который сможет это сделать.
Не очень понял, что Вам надо.
Скрипт просматривает указанную папку с подпапками Dir
Ищет файлы по указанной маске /b /s /a:-d
Архивирует в фоновом режиме -ibck каждый файл отдельно в zip в указанную папку -afzip
В архиве путь файла исключается -ep
Исходные файлы удаляются -df
При совпадении имён файлов заархивированным останется один из них.
-------
Даже самая сложная проблема обязательно имеет простое, лёгкое для понимания, неправильное решение. Каждое решение плодит новые проблемы.
Конфигурация компьютера | |
Процессор: Dual Core 2.6 Mhz | |
Материнская плата: BIOSTAR H61ML | |
Память: DDR3 2Gb | |
HDD: StoreJet Transcend | |
Видеокарта: Intel Corporation Sandy Bridge Integrated Graphics Controller | |
Звук: HDA Intel PCH | |
Монитор: PHILIPS | |
ОС: Linux Mint 9 Rosinka x86 Kernel:3.1.0-0301rc10-generic | |
Прочее: USB wi-fi TP-link TL series |
Здравствуйте. Подскажите пожалуйста каким образом можно заархивировать все файлы в текущей папке в отдельные архивы?
Например папка Documents содержит 5 файлов и нужно получить 5 архивов.Формат архивов и архиватор роли не играют, имя архива должно повторять имя файла. Была уже Похожая тема но мне нужен Bat'ник.
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.
Конфигурация компьютера | |
Процессор: Dual Core 2.6 Mhz | |
Материнская плата: BIOSTAR H61ML | |
Память: DDR3 2Gb | |
HDD: StoreJet Transcend | |
Видеокарта: Intel Corporation Sandy Bridge Integrated Graphics Controller | |
Звук: HDA Intel PCH | |
Монитор: PHILIPS | |
ОС: Linux Mint 9 Rosinka x86 Kernel:3.1.0-0301rc10-generic | |
Прочее: USB wi-fi TP-link TL series |
для 7z можно так
for %%i in (%_in%\*.*) do "%_arcpath%\7z" a "%_out%\%%~ni.7z" "%%i"
Если что не понятно, можно посмотреть здесь Каждый файл в отдельный архив
for %%i in (%_in%\*.*) do "%_arcpath%\7z" a "%_out%\%%~ni.7z" "%%i"
это просто отлично, а как быть чтоб он упаковывал каталоги можно по списку, можно и все что есть в текущем каталоге
чтобы скрипт рекурсивно упаковывал каталоги, нужно добавить ключик -r » |
это я так понимаю
set _in=d:\1
set _out=d:\2
set _arcpath=c:\Program Files\7-zip
for %%i in (%_in%\*) do "%_arcpath%\7z" a -r "%_out%\%%~ni.7z" "%%i"
каталоги не берет в расчет (
необходимо было чуточку по другому
всем спасибо
for /d %%i in (%_in%\*) do "%_arcpath%\7z" a "%_out%\%%~ni.7z" "%%i"
Прошу помочь так как не разбираюсь в вопросе.
Есть:
- каталог с вложенными каталогами в которых файлы fb2.
- WinRar с настроенным профилем архивирования - отдельно создает zip архив для каждого файла и удаляет исходный файл.
Нужно: Рекурсивно проверить все вложенные папки, выделить файлы, запустить упаковку WinRar-ом.
Беда в том что папок несколько тысяч и ручками слишком долго заходить в каждую.
Хотелось бы батник который сможет это сделать.
Не очень понял, что Вам надо.
Скрипт просматривает указанную папку с подпапками Dir
Ищет файлы по указанной маске /b /s /a:-d
Архивирует в фоновом режиме -ibck каждый файл отдельно в zip в указанную папку -afzip
В архиве путь файла исключается -ep
Исходные файлы удаляются -df
При совпадении имён файлов заархивированным останется один из них.
-------
Даже самая сложная проблема обязательно имеет простое, лёгкое для понимания, неправильное решение. Каждое решение плодит новые проблемы.
Формат архивов 7-Zip довольно гибкий и позволяет, например, включать весь архив как один из файлов внутри самого архива, лишь немного считерив. Разберём формат на примере: создадим почти вручную архив с именем «Рекурсивный.7z», содержащий два файла: «Какой-то файл.txt» с содержимым «Hello, Habrahabr!» и «Рекурсивный.7z», копию самого себя.
Краткая документация по формату входит в LZMA SDK. Архив начинается со следующей структуры размером 32 байта. Все позиции внутри архива кодируются как смещения относительно конца этой структуры.
Далее следуют данные файлов без какой бы то ни было информации о самих файлах и о границах данных. Основной заголовок, который описывает всё содержимое архива, размещается в конце архива.
Основной заголовок может быть сам по себе упакован (а также зашифрован). Поскольку он содержит структурированные данные (типа имён файлов), коэффициент сжатия достаточно неплохой. Именно для возможности подобного сжатия вся информация о файлах в 7z собрана в одном заголовке и полностью отделена от сжатых данных файлов. Признак упакованности — первый байт основного заголовка: он должен быть равен 1 у неупакованного заголовка и 0x17 у упакованного. Для создания архива вручную мы не будем ничего сжимать.
Общая схема (распакованного) основного заголовка из документации:
Давайте разбираться по порядку, формируя попутно нужный заголовок. Первые 32 байта мы заполним в последнюю очередь (для них нужен готовый основной заголовок), следующие байты — данные, которые мы для простоты сжимать не будем:
Записываем первый байт основного заголовка:
ArchiveProperties — свойства для возможного расширения, сейчас не используются, 7-Zip никогда их не создаёт и молча пропускает при чтении.
AdditionalStreams и MainStreams описывают структуру сжатых данных. Первый байт в AdditionalStreams равен 0x03, первый байт в MainStreams равен 0x04, в остальном их структура идентична (кстати, точно такую же структуру имеет упакованный основной заголовок после первого байта 0x17).
MainStreams описывают данные файлов. AdditionalStreams позволяют вынести некоторые данные (например, собранные вместе имена файлов) отдельно и сжимать независимо от основного заголовка; 7-Zip не использует такую возможность при записи (в реальных архивах AdditionalStreams отсутствуют), но способен обрабатывать их при чтении.
Записываем первый байт MainStreams и идём вглубь:
В 7-Zip преобразованиями данных занимаются кодировщики. У каждого кодировщика есть сколько-то входных потоков, сколько-то выходных потоков, свой собственный идентификатор и, возможно, какие-нибудь настройки. Большинство кодировщиков преобразуют один входной поток в один выходной поток: таковы, например, копирующий кодировщик (он-то нам и нужен), LZMA-упаковщик , AES-шифратор , BZip2-упаковщик (да, формат 7z вполне допускает алгоритмы, традиционно использующие другие форматы архивов). Пример кодировщика с несколькими выходными потоками: BCJ2 . Машинный код x86 и x86-64 устроен так, что команды вызова процедуры (E8 xx xx xx xx) и прыжков (E9 xx xx xx xx — длинный безусловный, 0F 8y xx xx xx xx — длинный условный) кодируют адрес назначения как смещение относительно своего конца. Из-за этого просто так сжатие «не заметит», что разные вхождения E8 xx xx xx xx (с разными xx из-за относительности смещения) — на самом деле вызов одной и той же процедуры. BCJ2 преобразует назначения вызовов и прыжков в абсолютную форму и выдаёт 4 выходных потока: первый — обычные данные, второй — назначения вызовов, третий — назначения прыжков, четвёртый — битовый поток, который на каждое появление E8/E9/0F 8x сообщает, есть ли соответствующее закодированное назначение или это просто байт данных.
Формат 7z описывает самую общую ситуацию: входной поток кодируется произвольным числом каких-то кодировщиков, выходы с которых в свою очередь могут быть входами других кодировщиков и так далее. Первый блок PackInfo в информации о потоках описывает все финальные потоки, записанные в архив (все выходные потоки кодировщиков, не поданные на вход каким-то другим кодировщикам): байт 0x06, кодированное начало финальных потоков в файле (в виде смещения относительно конца первого заголовка, потоки следуют один за другим последовательно), кодированное число потоков, байт 0x09, размеры всех финальных потоков (по одному кодированному числу на каждый финальный поток), байт 0x00. Между размерами потоков и концом структуры может быть информация о CRC финальных потоков, но она обычно не используется, а CRC контролируется у распакованных данных.
Целые числа в 7z кодируются следующим образом: количество ведущих единиц в первом байте определяет количество дополнительных байт, прочие биты первого байта суть старшие биты числа, дополнительные байты определяют младшие байты числа в little-endian. Числа, меньшие 0x80, кодируются одним байтом, равным самому числу. Числа, занимающие все 8 байт, кодируются с помощью приписывания в начало байта 0xFF.
У нас будет два потока. Первый — для файла «Какой-то файл.txt», начинающийся со смещения 0 относительно конца первого заголовка. Второй — для архива, начинающийся с начала файла. Поскольку потоки следуют один за другим последовательно, размер первого потока придётся сделать равным 0 — 0x20 = 0xFFFFFFFFFFFFFFE0. Размер архива мы пока не знаем, оставим под него два байта. Итак, формируем блок PackInfo:
Второй блок CodersInfo описывает все использованные кодировщики с параметрами и связи между ними. Кодировщики объединены в группы по связям, между группами связей нет. Например, одна группа может состоять из одного LZMA-упаковщика, вторая — из связки BCJ2+(несколько разных LZMA). Блок CodersInfo начинается с байт 0x07 0x0B, после которых следует кодированное число групп, нулевой байт (ненулевой означал бы вынесение информации о группах в отдельный AdditionalStream), по одной структуре Folder на группу. Каждая группа начинается с числа кодировщиков в группе, затем следует описание каждого кодировщика. Первый байт описания кодировщика содержит размер идентификатора в младших 4 битах, следующий бит установлен, только если у кодировщика число входных каналов или число выходных каналов не равно единице, следующий бит установлен, если у кодировщика есть параметры. Далее следует идентификатор, далее число выходных и входных каналов (если либо то, либо другое отлично от единицы), далее размер параметров (если они есть) и сами параметры в виде массива байт. После всех кодировщиков идёт описание связей: номер выходного канала и номер входного канала, которые нужно связать. Каждый входной канал, кроме одного, должен быть выходом какого-нибудь декодера, поэтому число связей равно суммарному количеству входных каналов во всех кодировщиках минус 1. Наконец, если число выходных потоков больше одного, то описание группы заканчивается списком индексов несвязанных выходных потоков в том порядке, в котором они записаны в архиве. После описания папок идёт байт 0xC и размеры всех входных каналов, включая связанные, всех папок. Как и PackInfo, блок CodersInfo заканчивается байтом 0x00. Между размерами потоков и концом структуры может быть информация о CRC входных данных, которая обычно используется только для информации о потоках упакованного заголовка (CRC файлов хранятся в следующем блоке). CRC, если есть для всех потоков, хранится так: сначала ненулевой байт (признак того, что CRC определена для всех потоков; иначе дальше бы шёл битовый массив, указывающий, для каких потоков CRC определена), потом по 4 байта CRC на каждый поток.
Формируем блок CodersInfo, учитывая, что у нас один копирующий кодировщик в каждой из двух групп для двух потоков, и по-прежнему оставляя два байта под пока ещё неизвестный размер архива:
Завершаем информацию о потоках нулевым байтом и возвращаемся на уровень выше:
FilesInfo, как нетрудно догадаться, содержит информацию о файлах внутри архива: имена, даты создания/изменения/доступа, атрибуты файлов. FilesInfo начинается с байта 0x05, следом идёт закодированное целое число, обозначающее число файлов, следом свойства (в некотором количестве). Каждое свойство начинается с ненулевого байта-идентификатора, после которого следует размер свойства (чтобы 7-Zip мог пропускать неизвестные свойства). Нулевой байт заканчивает FilesInfo. Имена файлов кодируются как свойство с типом 0x11, первый байт содержимого равен нулю (ненулевой байт означает, что всё дальнейшее содержимое свойства вынесено в отдельный AdditionalStream, индекс которого в общем массиве закодирован далее), дальше идут сами имена в UTF-16 с терминирующим нулём.
Даты и атрибуты мы для простоты заполнять не будем, а вот имена нужны. Заполняем блок FilesInfo:
Осталось только завершить весь заголовок привычным уже нулевым байтом:
Итак, размер всего файла 0x9E байт, теперь мы можем вернуться и записать на место вопросиков байты 80 9E, кодирующие число 0x9E. Осталось сформировать первый заголовок. Основной заголовок начинается с позиции 0x11 относительно конца первого заголовка и занимает 0x9E — 0x31 = 0x6D байт.
Теперь надо вычислить две CRC. Вручную считать CRC по 0x6D байтам довольно хлопотно, поэтому здесь прибегнем к помощи программ. Первая CRC, которую нам надо вычислить, — основной заголовок: байты с 0x31 до конца, его CRC равна 0x3F5E2977. Вторая CRC считается по трём последним полям первого заголовка, включая первую CRC: 11 00 00 00 00 00 00 00 6D 00 00 00 00 00 00 00 77 29 5E 3F. Она равна 0x6FA3DEA5. Наконец, соберём всё воедино и получим такой "Рекурсивный.7z":
Читайте также: