Zipar todos os arquivos no diretório?

396

Existe uma maneira de compactar todos os arquivos em um determinado diretório com o comando zip ? Já ouvi falar em *.* , mas também quero que ele funcione também para arquivos sem extensão.

    
por tkbx 28.11.2012 / 17:43

4 respostas

594

Você pode usar apenas * ; não há necessidade de *.* . As extensões de arquivo não são especiais no Unix. * corresponde a zero ou mais caracteres, incluindo um ponto. Portanto, corresponde a foo.png , porque são zero ou mais caracteres (sete, para ser exato).

Observe que * por padrão não corresponde aos arquivos que começam com um ponto (nem *.* ). Isso geralmente é o que você quer. Se não, no bash, se você for shopt -s dotglob (mas ainda excluirá . e .. ). Outras shells têm formas diferentes (ou nenhuma) de incluir arquivos de ponto.

Como alternativa, zip também tem uma opção -r (recursiva) para fazer árvores de diretório inteiras de uma vez (e não precisa se preocupar com o problema do dotfile):

zip -r myfiles.zip mydir

onde mydir é o diretório que contém seus arquivos. Observe que o zip produzido conterá a estrutura de diretório e os arquivos. Como peterph aponta em seu comentário, isso geralmente é visto como uma coisa boa: extrair o zip armazenará todos os arquivos extraídos em um subdiretório.

Você também pode dizer ao zip para não armazenar os caminhos com a opção -j / --junk-paths .

O comando zip vem com documentação informando sobre todas as suas (muitas) opções; digite man zip para ver essa documentação. Isso não é exclusivo do zip; você pode obter documentação para a maioria dos comandos dessa maneira.

    
por 28.11.2012 / 17:49
5

Outra forma seria usar find e xargs: (isso pode incluir um diretório "." no zip, mas ele ainda deve ser extraído corretamente. Com o meu teste, o zip removeu o ponto antes da compactação) find . -type f -exec zip zipfile.zip {} +

(O + pode ser substituído por \; se sua versão de find não suportar o + end para exec. Mas será mais lento ...)

Por padrão, isso incluirá todos os subdiretórios. No GNU, o -maxdepth pode impedir isso.

    
por 29.11.2012 / 09:28
5

No meu caso, eu queria compactar cada arquivo em seu próprio arquivo, então fiz o seguinte (em zsh ):

$ for file in *; do zip ${file%.*}.zip $file; done
    
por 17.01.2017 / 17:32
1

Outro método (lento) para fazer isso (que adiciona um arquivo ao zip de cada vez):

for f in * .[^.]*; do
    [ -r "$f" ] || continue # Skip directories or non-existant files (Probably ".[^.]*" if directory has no dotfiles). Using -e will allow directories to be used as well
    zip zipfile.zip "$f" # If directories are included, you probably want to add -r
done

Isso tem os problemas de dotfile de * (solução alternativa incluída) e seria zip inicializar uma vez para cada arquivo, adicionando-o ao archive. Em bash , ele lidaria com uma grande quantidade de arquivos.

Seria mais lento que a maioria dos outros métodos, mas é relativamente simples.

    
por 17.05.2018 / 18:12