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