Compacte um arquivo sem incluir o diretório pai

12

Eu tenho uma pasta que contém vários arquivos

pasta

  • artifact1.app
  • artifact2.ext2
  • artifact3.ext3
  • ...

Meu objetivo é compactar o arquivo fora desta pasta (sem usar o cdcomando) sem incluir o diretório da pasta.

zip -r ./folder/artifact.zip ./folder/artifact1.app

Este comando inclui a pasta dir no zip final. Alguma dica?

Pergunta relacionada: Compacte o conteúdo de uma pasta sem incluir a própria pasta

Lorenzo B
fonte
1
Nas páginas do manual, parece que apenas -jse aplicaria e isso compactaria todas as pastas em um único diretório no nível raiz dentro do ZIP. Não é isso que você está procurando, é?
Phyrfox 27/11/2015
@phyrfox Talvez sim. Precisa verificar isso. Obrigado.
Lorenzo B

Respostas:

13

Se você deseja armazenar todos os arquivos em folderseu nome sem uma indicação de diretório, pode usar a -jopção

zip -j folder/artifact.zip folder/artifact1.app folder/artifact2.ext2 folder/artifact3.ext3

ou

zip -j folder/{artifact.zip,artifact1.app,artifact2.ext2,artifact3.ext3}

Se você tiver arquivos em subdiretórios, eles também não terão nenhum componente de diretório no arquivo morto, por exemplo folder/subdir/foo, serão armazenados no arquivo morto como foo.

Mas provavelmente seria mais fácil mudar para o diretório. É quase exatamente a mesma quantidade de digitação que o método brace aboe. Se você fizer isso, se incluir arquivos em subdiretórios, eles terão o caminho relativo do diretório em que você mudou, por exemplo folder/subdir/foo, serão armazenados como subdir/foo.

(cd folder && zip artifact.zip artifact1.app artifact2.ext2 artifact3.ext3)

Para uso interativo, você perde a conclusão do shell dessa maneira, porque o shell não percebe que estará em um diretório diferente quando executar o zipcomando. Para remediar isso, emita o cdcomando separadamente. Para voltar facilmente ao diretório anterior, você pode usar pushde popd.

pushd folder
zip artifact.zip artifact1.app artifact2.ext2 artifact3.ext3
popd

Se você quiser ter controle total sobre os caminhos armazenados em um arquivo zip, poderá criar uma floresta de links simbólicos. Salvo indicação em contrário, zipnão armazena links simbólicos.

Gilles 'SO- parar de ser mau'
fonte
Você não precisa listar explicitamente todos os arquivos no subdiretório ( folder), você pode apenas usar um curinga, ou seja,zip -j folder/*
Jakub Kukul
Confiar na expansão do shell significa que os arquivos de ponto (por exemplo .profile) não serão incluídos no arquivo morto . Em vez disso, altere o diretório de trabalho atual e especifique .como o arquivo a ser arquivado:cd folder && zip -r ../folder.zip .
sheldonh