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

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

У меня есть директория с именем folder, которая выглядит следующим образом:

folder
      -> root_folder
                    -> некоторые файлы

Я хочу заархивировать эту директорию в zipped_dir, я пробовал:

zip -r zipped_dir.zip folder/*

Но это создает ZIP, который выглядит так:

zipped_dir
          -> folder
                   -> root_folder
                                 -> некоторые файлы

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

То есть, я хотел бы получить такой конечный результат:

zipped_dir
          -> root_folder
                        -> некоторые файлы

Попробуйте использовать эту команду (вы поймете идею)

cd folder; zip -r ../zipped_dir.zip *

Может быть, есть и другие способы, но этот самый быстрый и простой для меня 🙂

Используйте -j; например: zip -r -j zipped_dir.zip folder/*

Это не будет архивировать ‘root_folder’.

zip -r -D zipped.zip *

-D инструктирует zip не создавать директории.

Вот что работает для меня:

7z a zipped.zip ./rootDir/*

Это создаст zip архив с корнем: любые файлы/директории внутри rootDir, например:

zipped.zip:
     file1.txt
     otherdir/
        file2.txt

Скрытые файлы:

Как правильно указал @Shiva Wu‘s comment, вышеупомянутое не включает скрытые файлы.

Это также относится ко всем остальным ответам (по крайней мере, к тем, которые сохраняют структуру директорий). Одним решением является явное добавление маски скрытых путей.

# Команда ниже будет включать (среди прочего) все файлы и директории, начинающиеся с точки.
7z a zipped.zip ./rootDir/* ./rootDir/.[!.]*

ИЛИ

# То же самое, что и выше в одном аргументе
7z a zipped.zip ./rootDir/{*,.[!.]*}

результат:

zipped.zip:
     file1.txt
     .hiddenfile1.txt
     .hiddendir/
        file3.txt
     otherdir/
        file2.txt

Улучшенный ответ с учетом всех предложений в комментариях:

# Включите скобки, чтобы cd не повлияло на ваш текущий терминал
(cd folder; zip -r ../folder.zip ./)

Скрытые файлы также будут включены!, читайте другие ответы для объяснений…

Обратите внимание, что вы можете получить ошибку (bash: /usr/bin/zip: Argument list too long) при использовании ответа Ромео Нинова, если вы архивируете множество тысяч файлов. Чтобы избежать этого, используйте . вместо *, вот так:

cd folder
zip -r ../zipped_folder.zip .

Я использую опцию -r, “имя zip-файла” и список элементов, которые я хочу добавить в него. Обратись к опции --help, чтобы получить:

zip [-options] [-b path] [-t mmddyyyy] [-n suffixes] [zipfile list] [-xi list]

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

zip -r filename.zip ./*

Результат — это filename.zip, содержащий всё в директории, где вы выполняли команду.

Добавив команду для скрытых файлов, мы можем использовать ls -a из оболочки после команды zip (уже в директории, содержащей ваши требуемые файлы):

FILES=$(ls -a)
zip -r filename.zip $FILES

Для пользователей fish просто замените FILES=$(ls -a) на set FILES (ls -a).

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

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

Способ 1: Использование команды cd и zip

Вы можете перейти в нужную папку с помощью команды cd, а затем заархивировать содержимое текущей директории. Эта команда будет выглядеть следующим образом:

cd folder && zip -r ../zipped_dir.zip .

Здесь cd folder перемещает вас в директорию folder, а команда zip -r ../zipped_dir.zip . создает ZIP-архив из всех файлов и папок текущей директории, без учета самой директории folder.

Способ 2: Использование zip с указанием файлов

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

zip -r zipped_dir.zip folder/*

Однако необходимо учитывать, что при использовании данного подхода — folder/* — созданный архив будет содержать директорию folder, что нежелательно.

Способ 3: Использование 7z для архивации

Если у вас установлен 7z, можно использовать следующую команду:

7z a zipped_dir.zip ./folder/*

Этот метод также позволяет создать архив без включения родительской папки.

Учтите скрытые файлы

Если в директории находятся скрытые файлы (файлы и папки, имена которых начинаются с точки), приведенные выше команды не включат их в архив. Для этого добавьте их явно:

7z a zipped_dir.zip ./folder/* ./folder/.[!.]*

Либо, можно использовать следующую команду:

7z a zipped_dir.zip ./folder/{*,.[!.]*}

Способ 4: Использование только .

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

cd folder && zip -r ../zipped_dir.zip .

Этот способ хорошо работает, если количество файлов и директорий в папке относительно небольшое, так как он может вызвать ошибку Argument list too long, если будет много файлов.

Заключение

Выберите подходящий метод в зависимости от ваших требований и предпочтений. Все предложенные варианты являются эффективными держателями для архивирования содержимого директории без включения самой директории в итоговый архив.

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

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