Создать zip-файл и игнорировать структуру каталогов


219

Мне нужно создать ZIP-файл с помощью этой команды:

zip /dir/to/file/newZip /data/to/zip/data.txt

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

Я не нашел ответа в беглом взгляде на страницу руководства или поиск в Google.



2
Я думал, что этот вопрос предшествовал всем этим другим обменам стека, но, увы, пост суперпользователя на самом деле старше, чем этот. Если я могу чем-то помочь, дайте мне знать. Это должно быть довольно горячий ответ, так как Google по-прежнему привлекает сюда столько трафика. : D
Джейк

Ответы:


354

Вы можете использовать -j.

-j
--junk-paths
          Store just the name of a saved file (junk the path), and do  not
          store  directory names. By default, zip will store the full path
          (relative to the current directory).

20
Если -jне работает для вашего каталога (вместе с -r), проверьте этот ответ
czerasz

иногда это просто не работает ... предпочитаю ссылку @czerasz;), которая в основном представляет собой pushd popd combo
TecHunter

36

Использование -jне будет работать вместе с -rопцией.
Так что обходной путь для этого может быть следующим:

cd path/to/parent/dir/;
zip -r complete/path/to/name.zip ./* ;
cd -;

Или встроенная версия

cd path/to/parent/dir/ && zip -r complete/path/to/name.zip ./* && cd -

вы можете направить вывод, /dev/nullесли вы не хотите, чтобы cd -вывод отображался на экране


На самом деле, вы можете сделать следующее:cd path/to/parent/dir/ && zip -r ../../../../name.zip ./* && cd -
eddyP23

@ eddyP23 Как это имеет значение? Скорее это заставит вас добавить нет. parentDir (..) для каждого каталога в пути: |
Викас Тауния

Результат тот же, я согласен. Но в автоматизированных сценариях, которые выполняются во многих различных средах, вы обычно избегаете глобальных путей, потому что вы не знаете, каким будет глобальный путь. Но из cd path/to/parent/dir/вы можете легко рассчитать количество двойных точек ../.
eddyP23

@ eddyP23 имеет смысл
Викас Тауния

33

Используйте -jопцию:

   -j     Store  just the name of a saved file (junk the path), and do not
          store directory names. By default, zip will store the full  path
          (relative to the current path).


3

Кроме того, вы можете создать временную символическую ссылку на ваш файл:

ln -s /data/to/zip/data.txt data.txt
zip /dir/to/file/newZip !$
rm !$

Это работает также для каталога.


1

Сохраните родительский каталог, чтобы unzipне выбрасывать файлы везде

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

Поэтому, чтобы избежать сохранения всех путей, и поскольку вы не можете использовать -j и -r вместе (вы получите ошибку), вы можете сделать это вместо этого:

cd path/to/parent/dir/;
zip -r ../my.zip ../$(basename $PWD)
cd -;

Это ../$(basename $PWD)магия, которая сохраняет родительский каталог.

Так что теперь unzip my.zipвыдадим папку, содержащую все ваши файлы:

parent-directory
├── file1
├── file2
├── dir1
│   ├── file3
│   ├── file4

Вместо того, чтобы засорять текущий каталог разархивированными файлами:

file1
file2
dir1
├── file3
├── file4

0

Просто используйте -jrmопцию, чтобы удалить структуры файлов и каталогов

zip -jrm /path/to/file.zip /path/to/file

быть осторожным, -m --move Переместить указанные файлы в zip-архив; фактически это удаляет целевые каталоги / файлы после создания указанного архива zip. Если каталог становится пустым после удаления файлов, каталог также удаляется. Удаление не производится, пока zip не создал архив без ошибок. Это полезно для сохранения дискового пространства, но потенциально опасно, поэтому рекомендуется использовать его в сочетании с -T для проверки архива перед удалением всех входных файлов.
Каталине
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.