Como compactar uma lista de arquivos no Linux


17

Tenho muitos arquivos que preciso compactar em um único diretório. Não quero compactar todos os arquivos no diretório, mas apenas os que correspondem a uma determinada consulta.

eu fiz

grep abc file-* > out.txt 

para criar um arquivo com todas as instâncias de "abc" em cada arquivo. Eu preciso dos próprios arquivos. Como posso dizer ao bash para compactar apenas esses arquivos?


Curingas não funciona? Por quê? Se eu posso perguntar ...
jherran

@ jherran Eu não quero compactar todos os arquivos no diretório, apenas os que correspondem a uma determinada consulta. Eu fiz grep abc file-* > out.txtpara criar um arquivo com todas as instâncias de "abc" em cada arquivo. Eu preciso dos próprios arquivos.
precisa saber é o seguinte

O que @jherran significa é zip ZipFile.zip file-*, que é a maneira óbvia de fazê-lo. Você precisaria de um arquivo intermediário apenas se estivesse usando um complexo findou uma concatenação de listas de arquivos de pesquisas diferentes.
AFH

Respostas:


31

Muito simples:

zip archive -@ < out.txt

Ou seja, se o seu out.txtarquivo contiver um nome de arquivo por linha. Ele adicionará todos os arquivos de out.txtum arquivo chamado archive.zip.

A -@opção faz a zipleitura do STDIN.

Se você quiser pular a criação de um out.txtarquivo temporário , também poderá usar grepo recurso para imprimir nomes de arquivos. -rativa a pesquisa recursiva (pode não ser necessária no seu caso) e -limprime apenas nomes de arquivos:

grep -rl "abc" file-* | zip archive -@

Funciona bem, exceto que eu tenho um arquivo de lista onde existem espaços nos nomes dos arquivos. Eu tentei escapar deles com `` e não escapar deles, uma vez entre aspas e outra sem aspas ao redor do nome do arquivo (uma linha - um nome de arquivo). Nada funcionou até agora.
Thomas W.

2
Eu o fiz funcionar com espaços \ \ `escapados e sem aspas no arquivo e o seguinte:cat out.txt | while read line ; do xargs zip archive.zip $line ; done
Thomas W.

se você quiser zip arquivos com nomes semelhantes você poderia tentarzip archive.zip $(ls common_name*)
chepe263

@ chepe263 Isso interrompe se os arquivos tiverem espaços no caminho. Geralmente é desencorajado a analisar a saída.
slhck

Para qualquer pessoa em um Mac que acabou aqui, cortesia da indexação de mecanismos de pesquisa, a -@sintaxe da opção funciona bem a partir de 10.16, mesmo que a página de manual ainda inclua linguagem sobrenot on MacOS
Aidan Miles

0

Alternativas para a resposta aceita, a partir daqui :

cat out.txt | zip -@ zipfile.zip
cat out.txt | zip -@ - > zipfile.zip
zip zipfile.zip $(cat out.txt) -r
zip zipfile.zip -r . -i@out.txt
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.