Как мне .zip несколько файлов и сохранить их имена файлов. Например, file1.file file2.file -> file1.zip file2.zip

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

Как следует из названия, мне нужно сжать множество файлов (тысячи) в папке, чтобы каждый файл был упакован в отдельный архив с оригинальным именем файла в качестве имени .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 архивов

  1. Создание bash-скрипта
    Сначала мы можем создать bash-скрипт, который будет выполнять нужные команды. Это позволит нам легко архивировать файлы с одного вызова. Создайте новый файл, например, zipsep:

    touch zipsep

    Затем откройте его в текстовом редакторе (например, nano или vim) и вставьте следующий код:

    #!/bin/bash
    
    for i in "$@"
    do
     zip "${i}.zip" "$i"
    done

    Этот скрипт перебирает все переданные аргументы и создает для каждого из них .zip файл, используя оригинальное имя файла.

  2. Сделать скрипт исполняемым
    После сохранения изменений, необходимо сделать файл исполняемым:

    chmod +x zipsep
  3. Перемещение скрипта в директорию PATH
    Чтобы иметь возможность запускать скрипт из любой директории, переместите его в одну из директорий, присутствующих в переменной среды PATH, например:

    sudo mv zipsep /usr/local/bin
  4. Использование скрипта
    Теперь вы можете использовать созданный скрипт для архивирования файлов. Перейдите в нужную директорию с файлами и выполните следующую команду:

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

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

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