Perdoe essa pergunta mais básica, mas não consegui encontrar uma resposta direta ou um exemplo simples sobre troca de pilhas.
Digamos que eu tenho uma pasta de arquivos que gostaria de compactar em um arquivo zip que eu possa compartilhar com meus terríveis amigos do Windows (caso contrário, eu apenas usaria tar
e terminaria). Se parece com isso:
.
├── file1.txt
├── file2.txt
├── file3.txt
├── file.jpg
└── test.jpg
Supondo que eu zip
instalei:
sudo apt-get install zip
Vejo man zip
que isso me permite usar uma lista de arquivos:
- @ listas de arquivos. Se uma lista de arquivos for especificada como - @ [Não no MacOS], o zip utilizará a lista de arquivos de entrada da entrada padrão em vez da linha de comando. Por exemplo,
zip -@ foo
Então eu criei o zip.lst
seguinte:
cat zip.lst
file1.txt
file2.txt
file3.txt
file.jpg
test.jpg
E agora eu tentei:
zip -@ zip.lst
Mas não fez nada, exceto criar uma linha em branco no console. E eu posso continuar pressionando Entere ele continua criando mais linhas em branco sem aparentemente executar o comando. Após algumas pesquisas, percebi que precisava finalizar a entrada pressionando Ctrl+D
Mas agora eu recebo este erro:
zip warning: missing end signature--probably not a zip file (did you
zip warning: remember to use binary mode when you transferred it?)
zip warning: (if you are trying to read a damaged archive try -F)
zip error: Zip file structure invalid (zip.lst)
O que!? Como minha lista simples não é uma "estrutura de arquivo válida"? Volte ao manual para obter mais informações e examinarei mais de perto:
Se uma lista de arquivos for especificada como - @ ...
Então, eu tento sem -@
, e isso pelo menos processa-o imediatamente, sem ter que pressionar Ctrl+, Dmas fiquei com o mesmo erro .
Felizmente, encontrei um comentário em uma resposta a uma pergunta quase não relacionada que me levou a perceber que precisava nomear explicitamente o arquivo zip. Este erro ocorreu porque, por padrão, ele estava tentando criar um arquivo zip chamado zip.lst
. Mas como esse é o nome da minha lista, pode-se pensar que simplesmente a substituirá, mas não, estava de fato tentando atualizá-la. E como a lista obviamente não é um arquivo zip, obtemos o erro de estrutura de arquivo inválido e agora está claro por que disse "provavelmente não é um arquivo zip". Então eu tentei:
zip files.zip zip.lst
adding: zip.lst (deflated 35%)
Eureka! Eu posso ver que o arquivo zip foi criado e minha pasta agora contém isso:
.
├── file1.txt
├── file2.txt
├── file3.txt
├── file.jpg
├── files.zip
├── test.jpg
└── zip.lst
Mas espere antes de comemorarmos, vamos confirmar o conteúdo do arquivo zip primeiro:
unzip -l files.zip
Archive: files.zip
Length Date Time Name
--------- ---------- ----- ----
48 2016-05-24 15:30 zip.lst
--------- -------
48 1 file
Não! Bem, na verdade isso faz sentido com o uso padrão, porque apenas compactou o arquivo de lista que eu dei. Finalmente tentei novamente com, -@
mas obtive o mesmo resultado.
O que estou fazendo de errado?
BTW, eu sei que posso usar a GUI e fazê-lo com o mouse, mas preciso criar um script e, em geral, sou mais rápido na CLI quando sei o que estou fazendo.
ls
egrep
e zip de-@
, você pode usar globs shell para selecionar arquivos diretamente na linha de comando zip por exemplo,zip files.zip file*
ouzip images.zip *.jpg
. Além disso, quando se utiliza uma lista de nomes de arquivos a partir de um arquivo, você pode usar o redirecionamento em vez de chamar um processo gato separado,zip files.zip -@ < zip.lst