Как получить список всех файлов в директории с расширением zip

Обновлено: 06.07.2024

Если вы пользовались компьютером хоть немного, то возможно вам встречались файлы с расширением .zip. Это специальные файлы в которые могут содержать в сжатом состоянии большое количество других файлов, директорий и поддиректорий. Это делает их очень удобными для передачи данных через интернет. А знаете ли вы, что вы можете использовать Python для сжатия и распаковки архивов?

В этом уроке вы научитесь как использовать библиотеку zipfile, чтобы извлекать или упаковывать один или сразу несколько файлов в архив.

Сжатие Одиночных Файлов

Это очень просто, и потребует написать совсем немного кода. Начинаем с того, что импортируем модуль zipfile и затем инициируем объект ZipFile с возможностью записи, указав это с помощью второго параметра 'w'. Первый параметр, это путь к файлу. Вот код, который нам нужен:

Пожалуйста, обратите внимание, что я буду указывать путь во всех фрагментах кода в формате для Windows; если вы работаете на Linux или Mac, вам нужно будет внести соответствующие изменения.

Вы можете указать различные методы сжатия, что бы заархивировать файл. В Python версии 3.3 были добавлены новые методы BZIP2 и LZMA , а также некоторые другие инструменты, которые не поддерживают эти два метода сжатия. По этой причине безопасно использовать метод DEFLATED . Но вам все же стоит попробовать эти методы, что бы увидеть разницу в размерах сжатого файла.

Сжатие Нескольких Файлов

Это будет чуть сложнее, так как вы должны выполнить итерационный процесс для всех файлов. Код показанный ниже должен заархивировать все файлы в директории с расширением pdf.

На этот раз нам необходимо импортировать модуль os и использовать метод walk() , чтобы пробежаться про всем файлам и поддиректориям в нашей основной директории. Я архивирую только файлы с расширением pdf. Вы так же можете создавать различные архивные файлы для разных форматов файлов используя оператор if .

Если вы не хотите, сохранить структуру каталога, вы можете положить все файлы вместе, используя следующую строку:

Метод write() допускает три параметра. Первый параметр - это имя нашего файла, который мы хотим сжать. Второй параметр не обязательный, он позволяет вам указать другое имя для файла архива. Если ничего не указано, будет использоваться имя архивируемого файла.

Извлечение Всех Файлов

Вы можете использовать метод extractall() для извлечения всех файлов и папок из zip-файла в текущую рабочую директорию. Вы можете также указать имя папки в extractall() для извлечения всех файлов и директорий в заданный каталог. Если директория, которую вы указали не существует, метод сам создаст новую. Вот код, который вы можете использовать для извлечения файлов:

Если вы хотите распаковать несколько файлов, вам необходимо подставить имена этих файлов в виде списка.

Извлечение Единичных Файлов

Это подобно извлечению нескольких файлов. Одно отличие состоит в том, что на этот раз, вам необходимо сначала подставить имя файла и затем, путь для извлечения. Кроме того необходимо использовать метод extract() вместо extractall() . Вот фрагмент кода для извлечения отдельных файлов.

Чтение Архивов

Рассмотрим сценарий, где вам нужно узнать содержит ли zip-архив конкретный файл. До этого момента, вы могли это сделать только распаковав весь архив. Аналогичным образом, может потребоваться извлечь только те файлы, которые больше, определенного размера. Модуль Zipfile позволяет нам узнать содержимое архива без его распаковки.

Применение метода namelist() к объекту ZipFile вернет список всех элементов архива по имени. Чтобы получить информацию о конкретном файле в архиве, можно использовать для ZipFile метод getinfo() . Это даст вам доступ к информации об этом файле, такой как, размер сжатого и несжатого файла или информацию о времени его последнего изменения. Мы вернемся к этому позже.

Вызов метода getinfo() для каждого файла может быть утомительным процессом, когда этих файлов много. В этом случае можно использовать метод infolist() для возврата списка всех элементов, содержащихся в объекте ZipInf. Порядок этих объектов в списке такой же, как и в zip-файлах.

Вы можете также непосредственно прочитать содержимое определенного файла из архива, с помощью метода read(file) , где file — имя файла, который вы хотите прочесть. Для этого, архив должен быть открыт в режиме чтения или в режиме добавления.

Чтобы получить размер конкретного сжатого файла из архива, нужно использовать атрибут compress_size . Аналогично чтобы узнать, несжатый размер, можно использовать атрибут file_size .

Следующий код использует свойства и методы, которые мы только что обсудили, чтобы извлечь только те файлы, размер которых менее 1 МБ.

Чтобы узнать время и дату последнего изменения определенного файла из архива, можно использовать атрибут date_time . Это возвращает кортеж из шести величин. Этими величинами будут год, месяц, день месяца, часы, минуты и секунды, в установленном порядке. Год будет всегда больше или равен 1980 года и часы, минуты и секунды от нуля.

Информация об оригинальном размере файла и размере сжатого файла может помочь вам увидеть, принесло ли архивирование пользу. Я думаю, это может быть так же использовано и в других случаях.

Заключительные мысли

Как видно из этого урока, использование модуля zipfile, позволяет вам гибко использовать сжатие файлов. Вы можете архивировать файлы в директории в различные архивы в зависимости от их типа, имени и размера. Вы так же можете решать оставлять вам структуру директории или нет. Аналогично при извлечении файлов, вы можете извлекать их куда вам нужно, на основе собственных критериев, таких как размер, и т.д.

Если честно, мне было очень интересно архивировать и извлекать файлы пока я писал свой код. Я надеюсь урок был вам полезен, и если у вас остались какие-то вопросы, пишите их пожалуйста в комментариях.

В этой статье я расскажу об основах создания, взаимодействия, проверки и извлечения файлов zip-архива с помощью Java (в частности, OpenJDK 11). Пример кода, используемый в этой статье, выполнен в виде проекта Gradle и размещен в этом репозитории GitHub для запуска и экспериментов. Пожалуйста, будьте осторожны при изменении кода, который удаляет файлы.

Как уже упоминалось, примеры кода здесь написаны с использованием Java 11 и используют ключевое слово var , которое было введено в Java 10, и парадигмы функционального программирования в Java 8, поэтому для их запуска требуется минимальная версия Java 10 как есть.

Содержание

Ключевые классы Java для работы с Zip-архивами

Я чувствую, что это хорошая идея, чтобы начать с определения некоторых известных классов, которые обычно используются при работе с zip-архивами в Java. Эти классы живут либо в java.util.zip или java.nio.файл пакеты.

Общие пути к файлам для примеров кода

Для примера кода я использую два общих каталога для записи и чтения данных в/из которых оба относятся к корню проекта Gradle. Взгляните на связанное репо во введении или, еще лучше, запустите образцы. Просто имейте в виду эти две переменные пути, поскольку они часто используются в качестве начального каталога для входов и выходов.

Вы можете создать экземпляр класса ZipFile и передать ему путь к существующему zip-архиву, который, по сути, открывает его, как и любой другой файл, а затем проверить содержимое, запросив перечисление ZipEntry , содержащееся в нем. Обратите внимание, что Zip-файл реализует Автоклавируемый интерфейс, что делает его отличным кандидатом для попробуйте с ресурсами Java-программную конструкцию, показанную ниже и во всех приведенных здесь примерах.

Запуск проекта Gradle с использованием следующих:

Это дает результат для приложения.показать содержимое Zip метод:

Здесь вы можете видеть, что при этом выводятся все файлы и каталоги в zip-архиве, даже файлы внутри каталогов.

Извлечение Zip-архива

Для извлечения содержимого zip-архива на диск требуется не что иное , как репликация той же структуры каталогов, что и внутри файла ZipFile , которую можно определить с помощью каталога ZipEntry.IS , а затем копирование файлов, представленных в экземплярах ZipEntry , на диск.

Запись файлов непосредственно в Новый Zip-архив

Поскольку запись zip-архива на самом деле не что иное, как запись потока данных в какое-либо место назначения (в данном случае в Zip-файл), то запись данных, например строковых данных, в zip-архив отличается только тем, что вам нужно сопоставить данные, записываемые в ZipEntry экземпляры, добавленные в ZipOutputStream .

Опять же, ZipOutputStream реализует автоклавируемый интерфейс, поэтому его лучше всего использовать с инструкцией try-with-resources. Единственная реальная загвоздка в том, чтобы не забыть закрыть свой ZipEntry , когда вы закончите с каждым из них, чтобы было ясно, когда он больше не должен получать данные.

Архивирование существующего файла в Новый Zip-архив

Если вы скопировали файл на Java до этого, вы, по сути, уже являетесь профессионалом в создании zip-архива из существующего файла (или каталога, если на то пошло). Опять же, единственная реальная разница заключается в том, что вам нужно проявить немного дополнительной осторожности, чтобы убедиться, что вы сопоставляете файлы с соответствующими экземплярами ZipEntry .

Архивирование папки в Новый Zip-архив

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

Git Essentials

Ознакомьтесь с этим практическим руководством по изучению Git, содержащим лучшие практики и принятые в отрасли стандарты. Прекратите гуглить команды Git и на самом деле изучите это!

Я также использую несколько иной подход для ввода файлов, не относящихся к каталогу, в поток zipoutput по сравнению с последним примером, но я просто использую этот другой подход для разнообразия в примерах.

Вывод

В этой статье я обсудил и продемонстрировал современный подход к работе с zip-архивами на Java с использованием чистой Java и без сторонних библиотек. Вы также можете заметить, что я использую несколько более современных функций языка Java, таких как парадигмы функционального программирования и ключевое слово var для переменных, определяемых типом, поэтому, пожалуйста, убедитесь, что вы используете по крайней мере Java 10 при запуске этих примеров.

Как всегда, спасибо за чтение и не стесняйтесь комментировать или критиковать ниже.

Есть много вещей, которые вы можете сделать с помощью команды Linux zip

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

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

Если у вас есть 10 файлов размером 100 мегабайт, и вам нужно перенести их на FTP-сайт, передача может занять значительное время в зависимости от скорости вашего процессора. Если вы сжимаете все 10 файлов в один заархивированный архив, и сжатие уменьшает размер файла до 50 МБ на файл, то вам нужно только передать половину данных.

Как создать архив всех файлов в папке

Представьте, что у вас есть папка песен со следующими MP3-файлами:

Шоссе AC/DC в ад

Люблю голодного мужчину.mp3

Прогуляйся по тебе.mp3

Если тебе нужна кровь, ты ее получишь .mp3

Покажите вниз в огне.mp3

Сенсорный слишком много .mp3

Биение вокруг bush.mp3

Girls Got Rhythm.mp3

Эта простая команда Linux, которая иллюстрирует, как создать архив всех файлов в текущей папке с именем ACDC_Highway_to_Hell.zip:

Текст прокручивается вверх по экрану, показывая файлы по мере их добавления.

Как включить скрытые файлы в архив

Предыдущая команда хороша для архивирования всех файлов в папке, но она включает только файлы, которые не скрыты. Это не всегда так просто. Представьте, что вы хотите сжать домашнюю папку, чтобы ее можно было сохранить на USB-накопитель или внешний жесткий диск. Ваша домашняя папка содержит скрытые файлы.

Чтобы сжать все файлы, включая скрытые файлы в папке, выполните следующую команду:

Это создает файл с именем home.zip со всеми файлами в домашней папке. (Вы должны быть в домашней папке, чтобы это работало). Проблема этой команды в том, что она включает в себя только файлы в домашней папке, а не в папках, что приводит нас к следующему примеру.

Как архивировать все файлы и подпапки в Zip-файле

Чтобы включить все файлы и подпапки в архив, выполните следующую команду:

Как добавить новые файлы в существующий архивный архив

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

Например, представьте, что у вас есть музыкальная папка с четырьмя альбомами в ней, и вы создаете архив с именем music.zip для хранения в качестве резервной копии. А теперь представьте, через неделю вы скачаете два новых альбома. Чтобы добавить новые альбомы в zip-файл, просто запустите ту же команду zip, что и на предыдущей неделе.

Для создания оригинального музыкального архива запустите следующий код:

zip -r music/home/yourname/music/

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

Если в zip-файле содержится список файлов, а один из файлов на диске изменился, то исправленный файл обновляется в zip-файле.

Как обновить существующие файлы в заархивированном архиве

Если у вас есть zip-файл, который должен каждый раз содержать одни и те же имена файлов, и вы хотите обновить этот файл любыми изменениями, внесенными в эти файлы, то переключатель -f поможет вам сделать это. ,

Например, представьте, что у вас есть заархивированный файл со следующими файлами:

Теперь представьте, что в течение недели вы добавили два новых файла и изменили два файла так, чтобы папка/home/yourname/documents теперь выглядела так:

/home/ваше имя/документы/file4 (обновлено)

/home/ваше имя/документы/file5 (обновлено)

Когда вы выполните следующую команду, zip-файл будет содержать обновленные файлы (file4 и file5), но file7 и file8 не будут добавлены.

zip zipfilename -f -r/home/yourname/documents

Как удалить файлы из архива

Итак, вы создали большой zip-файл с сотнями файлов и теперь понимаете, что в zip-файле есть четыре или пять файлов, которые вам там не нужны. Без необходимости снова архивировать все эти файлы, вы можете просто запустить команду zip с переключателем -d следующим образом:

zip zipfilename -d [имя файла в архиве]

Например, если у вас есть файл в архиве с именем home/documents/test.txt, вы удалите его с помощью этой команды:

zip zipfilename -d home/documents/test.txt

Как скопировать файлы из одного Zip-файла в другой

Если у вас есть файлы в одном zip-файле, и вы хотите скопировать их в другой zip-файл, не извлекая их сначала и не разархивируя, используйте переключатель -u .

Предположим, у вас есть zip-файл с именем «Variousmusic.zip» с музыкой от разных исполнителей, одним из которых является AC/DC. Вы можете скопировать песни AC/DC из файла Variousmusic.zip в файл ACDC.zip, используя следующую команду:

zip Variousmusic.zip -U --out ACDC.zip "Back_In_Black.mp3"

Приведенная выше команда копирует файл «Back_In_Black.mp3» из различных музыкальных файлов.zip в ACDC.zip. Если zip-файл, в который вы копируете, не существует, он создается.

Как использовать Pattern Matching и Piping для создания архива

Следующий переключатель действительно полезен, потому что он позволяет вам использовать выходные данные других команд для вставки файлов в ваш zip-файл. Предположим, вы хотите создать файл с именем lovesongs.zip, который содержит каждую песню, в названии которой есть слово «любовь».

Чтобы найти файлы с любовью в заголовке, вы можете использовать следующую команду:

find/home/yourname/Music -name * love *

Приведенная выше команда не идеальна на 100 процентов, потому что она также подбирает слова типа «клевер», но вы поняли идею. Чтобы добавить все возвращенные результаты из вышеприведенной команды в zip-файл с именем lovesongs.zip, выполните эту команду:

find/home/yourname/Music -name * love * | zip lovesongs.zip - @

Как создать сплит архив

zip mymusic.zip -r/home/myfolder/Music -s 670 м

Как настроить отчет о ходе процесса архивирования

Существуют различные способы настройки вывода, который появляется во время выполнения архивирования.

Доступны следующие переключатели:

  • -db = показывает, сколько байтов было заархивировано и сколько осталось
  • -dc = отображает количество заархивированных файлов и сколько их осталось
  • -dd = отображает точки для каждых 10 МБ файла, который был заархивирован
  • -ds = устанавливает частоту появления точек
  • -du = отображает несжатый размер каждого файла

zip myzipfilename.zip -dc -r/home/music

Это полезно, если вы создали разделенный архив с помощью переключателя -s и потеряли один из файлов архива.

Например, попробуйте сначала это:

zip -F myfilename.zip --out myfixedfilename.zip

zip -FF myfilename.zip --out myfixedfilename.zip

Как зашифровать архив

Если у вас есть конфиденциальная информация, которую вы хотите сохранить в zip-файле, используйте команду -e для ее шифрования. Вас попросят ввести пароль и повторить пароль.

zip myfilename.zip -r/home/wikileaks -e

Как показать, что будет в архиве

zip myfilename.zip -r/home/music/-sf

Как проверить архив

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

Вы можете использовать переключатель -T для проверки правильности zip-файла.

zip myfilename.почтовый индекс -T

Вывод этой команды, когда архив недействителен, может выглядеть примерно так:

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

Как исключить файлы

Иногда вы хотите исключить определенные файлы из zip-файла. Например, если вы копируете файлы со своего телефона или цифровой камеры, у вас есть смесь видео и изображений. Возможно, вы захотите сжать фотографии в photos.zip и видео в videos.zip.

Вот один из способов исключить видео при создании photos.zip

zip photos.zip -r/home/photos/-x * .mp4

Как указать уровень сжатия

Когда вы сжимаете файлы в zip-файл, система решает, следует ли сжимать файл или просто сохранить его. Например, файлы MP3 уже сжаты, поэтому нет смысла их дополнительно сжимать; они обычно хранятся как внутри zip-файла.

Однако вы можете указать уровень сжатия от 0 до 9 для дальнейшего сжатия файла. Это занимает больше времени, но может значительно сэкономить место.

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

Чтобы обеспечить максимум удобства работы с 7-Zip в консоли, рекомендуем добавить архиватор в переменную Path, это избавит вас от необходимости переходить в каталог с исполняемым файлом архиватора.

Откроете командой systempropertiesadvanced свойства системы и нажмите кнопку «Переменные среды».

Свойства системы

В окне выделите мышкой системную переменную Path, нажмите «Изменить».

Переменные среды

В окошке редактора кликнете по кнопке «Создать» и введите в появившееся поле путь к папке 7-Zip .

Путь к папке 7-Zip

Теперь, когда у вас возникнет необходимость вывести содержимое архива единым списком, выполните в командной строке команду:

7z l путь-к-архиву

7z l

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

Listing archive

Если название нужного файла вам известно, добавьте к команде через пробел название файла с расширением и аргумент -r, например, вот так:

7z l E:\limanzip.zip "Бурманская кошка.txt" -r

В двойные кавычки название файла берется, если оно содержит пробелы.

CMD

Если вам известна только часть имени файла и неизвестно расширение, можно воспользоваться подстановочными знаками:

7z l E:\limanzip.zip "Бу*.*" -r

7z

Соответственно, если неизвестно имя, но известен формат, последний указывается вместо второй звёздочки. 7-Zip поддерживаются также и другие аргументы командной строки, например, A вместо l создает архив из указанного ресурса (файла или папки) , а X — извлекает содержимое архивов в текущую папку.

Читайте также: