Вопрос или проблема
Как следует из названия, мне нужно сжать множество файлов (тысячи) в папке, чтобы каждый файл был упакован в отдельный архив с оригинальным именем файла в качестве имени .zip файла.
Если я попытаюсь сделать это с помощью gzip, это просто:
$gzip *.fileextension
и он сожмет каждый файл в .gz, удалит оригинал и переименует себя в оригинальное имя файла
Пример
Входные данные:
file1.txt
file2.txt
file3.txt
Выходные данные:
file1.gz
file2.gz
file3.gz
КАК Я МОГУ СДЕЛАТЬ ЭТО С .ZIP?
Вы можете создать небольшой bash-скрипт zipsep
,
#!/bin/bash
for i in "$@"
do
zip "$i".zip "$i"
done
Сделайте его исполняемым,
chmod +x zipsep
Переместите его в каталог в PATH,
sudo mv zipsep /usr/local/bin
Теперь вы можете использовать zipsep
, чтобы сжать каждый файл отдельно, например
zipsep *.txt
Если вы хотите удалить оригинальные файлы, вы можете сделать это отдельно позже, в приведенном выше примере с помощью
rm *.txt
или интерактивно, если всего несколько файлов (безопаснее)
rm -i *.txt
Также возможно вставить удаление в скрипт, но я предпочел бы сделать это отдельно.
Редактировать: Если не будет проблем с файлами с одинаковыми именами, но с разными расширениями, например file1.txt
и file1.doc
и file2.pdf
, вы можете использовать замену параметров bash, чтобы удалить оригинальное расширение из имени zip-файла. Смотрите man bash
и ищите ‘Расширение параметров’ и ${parameter%word}
‘Устранить совпадающий суффикс’.
#!/bin/bash
for i in "$@"
do
zip "${i%.*}".zip "$i"
done
Если вы уже создали zip-файлы, не удалив оригинальное расширение, вы можете использовать следующую команду, чтобы проверить, что это работает как задумано, «сухой запуск»,
rename -n 's/\.[a-zA-Z0-9]*\././' *.zip
а затем удалите опцию -n
, чтобы выполнить это,
rename 's/\.[a-zA-Z0-9]*\././' *.zip
С помощью этого метода вы избежите перезаписи, если оригинальные файлы имели одинаковые имена и разные расширения. По крайней мере, моя версия rename
откажется перезаписать, ‘perl rename’: см. man rename
:
Оригинальный “rename” не проверял существование целевых
имен файлов, поэтому его нужно было использовать осторожно. Я надеюсь, что я это исправил (Робин
Баркер).
Я запустил однострочный скрипт “for loop” и получил желаемый результат, как вы и просили.
for file in *;
do
zip $file.zip $file
rm -rf $file
done
- что это делает – создает zip-файл с оригинальным именем файла, и как только zip создан, он удаляет файл.
Ответ или решение
Чтобы заархивировать несколько файлов в формате .zip
и сохранить оригинальные имена файлов, необходимо использовать команду zip
в оболочке Bash. В данной статье мы рассмотрим, как создать отдельный .zip
файл для каждого из выбранных файлов, а также как удалить оригиналы после их архивирования.
Шаги для создания .zip
архивов
-
Создание bash-скрипта
Сначала мы можем создать bash-скрипт, который будет выполнять нужные команды. Это позволит нам легко архивировать файлы с одного вызова. Создайте новый файл, например,zipsep
:touch zipsep
Затем откройте его в текстовом редакторе (например,
nano
илиvim
) и вставьте следующий код:#!/bin/bash for i in "$@" do zip "${i}.zip" "$i" done
Этот скрипт перебирает все переданные аргументы и создает для каждого из них
.zip
файл, используя оригинальное имя файла. -
Сделать скрипт исполняемым
После сохранения изменений, необходимо сделать файл исполняемым:chmod +x zipsep
-
Перемещение скрипта в директорию PATH
Чтобы иметь возможность запускать скрипт из любой директории, переместите его в одну из директорий, присутствующих в переменной средыPATH
, например:sudo mv zipsep /usr/local/bin
-
Использование скрипта
Теперь вы можете использовать созданный скрипт для архивирования файлов. Перейдите в нужную директорию с файлами и выполните следующую команду:zipsep *.txt
Это создаст
.zip
архивы для всех файлов с расширением.txt
.
Удаление оригинальных файлов
Если вы хотите удалить оригинальные файлы после их архивирования, вы можете использовать одну из следующих команд после завершения работы скрипта:
-
Для удаления всех файлов с определенным расширением (например,
.txt
):rm *.txt
-
Для интерактивного удаления (более безопасный вариант):
rm -i *.txt
Оптимизация имени архива
Если вы хотите убрать оригинальное расширение файла из имени .zip
архива, вы можете изменить скрипт, используя подстановку параметров Bash:
#!/bin/bash
for i in "$@"
do
zip "${i%.*}.zip" "$i"
done
Этот подход позволит вам создать архивы с именами, совпадающими с именами оригинальных файлов, но без их расширений.
Вывод
Создание отдельных .zip
архивов из множества файлов с сохранением оригинальных имен возможно с помощью простого Bash-скрипта. Этот метод не только ускоряет процесс, но и делает его более удобным. С помощью приведенных выше шагов вы сможете эффективно архивировать ваши данные, сохраняя организованность вашей файловой системы.