Создать 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).
Дэн Д.
источник
18

Несколько связано - я искал решение сделать то же самое для каталогов. К сожалению, -jопция не работает для этого :(

Вот хорошее решение о том, как это сделать: /superuser/119649/avoid-unwanted-path-in-zip-file

хлопьевидный
источник
3

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

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

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

MirkoBanchi
источник
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
AndrewD
источник
0

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

zip -jrm /path/to/file.zip /path/to/file
Кадер Дорости
источник
быть осторожным, -m --move Переместить указанные файлы в zip-архив; фактически это удаляет целевые каталоги / файлы после создания указанного архива zip. Если каталог становится пустым после удаления файлов, каталог также удаляется. Удаление не производится, пока zip не создал архив без ошибок. Это полезно для сохранения дискового пространства, но потенциально опасно, поэтому рекомендуется использовать его в сочетании с -T для проверки архива перед удалением всех входных файлов.
Каталине