Архив 7zip с несколькими файлами с их соответствующими именами

Вопрос или проблема

У меня есть много файлов, которые я хочу архивировать/сжимать с помощью утилиты 7zip. Все они находятся в одной папке. Каждый архив должен иметь такое же имя, как и файл, который нужно архивировать.

Например, если файлы это 1.txt, 2.txt, 3.txt, тогда архивы должны быть 1.7z, 2.7z и так далее.

Я нашел несколько пакетных сценариев, но мне нужен bash-скрипт.

Я могу перечислить все файлы, используя

for i in *.txt; do echo $i; done

но не могу заставить это работать с командой 7zip, т.е. 7z a 'archive.7z' 'file.txt'

for i in *.txt; do 7z a "${i%%.*}.7z" "$i"; done

Эта команда, похоже, работает. Если ваше имя файла содержит пробелы, попробуйте установить разделитель на перенос строки. Я достиг этого, используя эту команду IFS=$'\n'.

${i%%.*} эта конструкция использовалась для удаления расширения .txt в моем случае. Если вы хотите, чтобы ваш архив выглядел так .txt.7z, просто используйте $i.7z, и это сработает.

архивируйте несколько файлов параллельно:

ls *.txt | xargs -i -n 1 -P 12 7z a -mx=9 -sdel -stl -bso0 -bsp0 -y -- "{}.7z" "{}" 

где:

  • ls *.txt перечисляет все файлы txt. также можно использовать cat my_filelist.lst
  • xargs -i -n 1 -P 12 – выполняет 7z с 12 параллельными потоками
  • -mx=9 – максимальное сжатие
  • -stl – назначает дату файла архиву 7z
  • -bso0 -bsp0 – подавляет избыточный вывод 7z в консоль, оставляя ошибки.
  • -y – перезаписывает существующий архив 7z, если он есть
  • -sdel – удаляет оригинальный файл после успешного сжатия
  • {} оригинальное имя файла
  • "{}.7z" – целевое имя архива, также может быть "/archive/{}.7z"

П.С.
для больших файлов это может не быть действительно необходимо для 7z, так как он все равно сжимает большие файлы с использованием нескольких ЦП.. но для многих маленьких файлов – эффективно.

Ответ или решение

Архивирование нескольких файлов с помощью 7-Zip в Bash-скрипте

Если вы хотите архивировать множество файлов в одной папке с помощью утилиты 7-Zip, при этом создавая архивы с именами, соответствующими именам исходных файлов, вам поможет следующий подход. Мы рассмотрим необходимые шаги с пояснениями и примерами кода.

Шаг 1: Подготовка

Для начала убедитесь, что 7-Zip установлен на вашем компьютере. Для Linux это может быть p7zip, который можно установить через пакетный менеджер. Например:

sudo apt-get install p7zip-full

Шаг 2: Простой скрипт для архивирования

Для архивирования файлов, находящихся в одной директории, создайте Bash-скрипт, который будет обрабатывать все текстовые файлы (или файлы любого другого расширения) в заданной папке.

Вот пример простого скрипта:

#!/bin/bash

# Установим Internal Field Separator на новый строковый символ
IFS=$'\n'

# Цикл по всем файлам с расширением .txt в текущей директории
for i in *.txt; do
    # Создание архива с именем исходного файла без расширения и добавлением .7z
    7z a "${i%%.*}.7z" "$i"
done

# Возврат к старому значению IFS, если необходимо
unset IFS

В этом примере:

  • IFS=$'\n' позволяет корректно обрабатывать имена файлов с пробелами.
  • Команда 7z a "${i%%.*}.7z" "$i" создает архив, названный так же, как файл, но с расширением .7z.

Шаг 3: Параллельная обработка файлов

Если у вас много файлов и вы хотите ускорить процесс архивации, можно использовать xargs для выполнения 7-Zip в нескольких потоках. Вот как вы можете сделать это:

ls *.txt | xargs -i -n 1 -P 12 7z a -mx=9 -sdel -stl -bso0 -bsp0 -y "{}.7z" "{}"

Пояснения к параметрам:

  • -n 1 указывает на то, что будет обрабатываться по одному файлу за раз.
  • -P 12 задает количество параллельных потоков (в данном случае — 12).
  • -mx=9 — максимальная степень сжатия.
  • -sdel — удаление оригинального файла после успешного архивирования.
  • -stl — установка даты файла для архива.
  • -bso0 и -bsp0 — подавление избыточного вывода в консоль.
  • -y — автоматическое подтверждение перезаписи существующих архивов.

С помощью данного подхода вы сможете успешно архивировать множество файлов, создавая для каждого своя ZIP-архив, соответствующий имени файла.

Заключение

Используя этот Bash-скрипт и команды, вы сможете эффективно автоматизировать процесс архивирования файлов с помощью 7-Zip. Не забывайте адаптировать параметры под свои нужды и следить за состоянием системы, если вы работаете с большим количеством данных. Вы также можете расширить функциональность скрипта, добавив обработку других типов файлов и настройки архивирования.

Оцените материал
Добавить комментарий

Капча загружается...