Вопрос или проблема
У меня есть много файлов, которые я хочу архивировать/сжимать с помощью утилиты 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. Не забывайте адаптировать параметры под свои нужды и следить за состоянием системы, если вы работаете с большим количеством данных. Вы также можете расширить функциональность скрипта, добавив обработку других типов файлов и настройки архивирования.