Existe uma maneira de compactar todos os arquivos em um determinado diretório com o zip
comando? Já ouvi falar em usar *.*
, mas também quero que funcione para arquivos sem extensão.
command-line
wildcards
zip
tkbx
fonte
fonte
zip myarch.zip mydir/*
?zip -r myarch.zip mydir/*
zip -r myarch.zip mydir
*.*
significa qualquer arquivo com um ponto. No cp / me no todos os arquivos tinham um ponto, e isso fez você digitá-lo (não pôde*
). Portanto, as pessoas passaram a ver*.*
como todos os arquivos. Eventualmente, a Microsoft adicionou nomes de arquivos longos que poderiam ter zero ou mais pontos. Para encontrar um arquivo com um ponto no Windows, você deve digitar*.*.*
.Respostas:
Você pode apenas usar
*
; não há necessidade*.*
. As extensões de arquivo não são especiais no Unix.*
corresponde a zero ou mais caracteres, incluindo um ponto. Portanto, correspondefoo.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ê deseja. Caso contrário, no bash, se vocêshopt -s dotglob
quiser (mas ainda excluirá.
e..
). Outros shells têm maneiras diferentes (ou nenhuma) de incluir arquivos de ponto.Como alternativa,
zip
também tem uma-r
opção (recursiva) para executar árvores de diretório inteiras de uma só vez (e não precisa se preocupar com o problema do arquivo de pontos):Onde
mydir
está o diretório que contém seus arquivos. Observe que o zip produzido conterá a estrutura de diretórios e os arquivos. Como Peter aponta em seu comentário, isso geralmente é visto como uma coisa boa: a extração do 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
zip
comando vem com documentação informando sobre todas as suas (muitas) opções; digiteman zip
para ver essa documentação. Isso não é exclusivo do zip; você pode obter documentação para a maioria dos comandos dessa maneira.fonte
*
globbing de shell não inclui arquivos de ponto (por exemplo, nomes de arquivos começando com.
). Essa é outra vantagem de compactar o diretório inteiro por nome..
e..
?No meu caso, eu queria compactar cada arquivo em seu próprio arquivo, então fiz o seguinte (em
zsh
):fonte
mkv
aqui? Também nada aqui é particularmentezsh
específico. Você desejará citar adequadamente qualquer variável que contenha um nome de arquivo, portanto,zip "${file%.*}.zip" "$file"
entre aspas duplas em torno das duas variáveis.mkv
. Em segundo lugar, citar argumentos é desnecessáriozsh
, ao contrário debash
. Por isso especifiquei que isso era um comandozsh
.find . -type f -maxdepth 1 -print0|xargs -r0 -n1 -P64 -I{} bash -c 'f="{}"; zip "${f%.*}.zip" "$f"'
(com-P
ajustado dependendo de suas linhas de CPU ...) (muitas dependências GNU ...)Outra maneira seria usar o find e xargs: (isso pode incluir um diretório "." No zip, mas ainda deve ser extraído corretamente. Com o meu teste, o zip retirou o ponto antes da compactação)
find . -type f -exec zip zipfile.zip {} +
(Ele
+
pode ser substituído\;
se a sua versão dofind
não suportar o+
final para o exec. Será mais lento, porém ...)Por padrão, todos os subdiretórios serão incluídos. No GNU encontrar
-maxdepth
pode impedir isso.fonte
*
, isso vai incluir dotfiles e não vai cair se houver muitos arquivos em um diretório)Outro método (lento) para fazer isso (que adiciona um arquivo ao zip de cada vez):
Isso tem os problemas do dotfile de
*
(solução alternativa adicionada) e seria iniciado o zip uma vez para cada arquivo, adicionando-o ao arquivo morto . Embash
, lidaria com uma grande quantidade de arquivos.Seria mais lento que a maioria dos outros métodos, mas é relativamente simples.
fonte
for f in *; do zip zip.zip "$f"; done