Zipar todos os arquivos não compactados em uma pasta em uma linha

2

Eu tenho muitos arquivos de texto que quero compactar. Cada arquivo deve ser compactado separadamente. Mas alguns deles já estão comprimidos.

Como eu, em uma linha, comprimo todos os arquivos que terminam com .txt adicionando .zip ao nome deles?

Eu sei em Bash que posso, mas não sei como.

  • find /path/to/files -name "*.txt" irá me listar esses arquivos
  • zip fname.txt.zip fname.txt comprimirá o arquivo
  • rm fname.txt removerá o arquivo original

Como eu canalizo esses em uma linha? Tenho pouca compreensão do xargs que vejo com frequência nesses casos

    
por usr-local-ΕΨΗΕΛΩΝ 21.03.2016 / 09:44

2 respostas

3

Embora isso possa ser feito com um comando canalizado, o find é capaz de fazer isso sozinho:

find /path/to/files -name '*.txt' -exec zip '{}.zip' '{}' ';' -exec rm '{}' ';'

Como você pode imaginar, -exec executa o comando que é terminado por um ponto e vírgula (que está oculto do shell usando aspas ou uma barra invertida) e {} significa o nome do arquivo encontrado e manipulado atualmente (e também está oculto do arquivo). shell).

    
por 21.03.2016 / 10:35
0

Tomou um fôlego e ... dois comandos

  • find . | grep -i '\.txt$' | xargs -I {} zip {}.zip {}
  • find . | grep -i '\.txt$' | xargs -I {} rm {}
por 21.03.2016 / 10:08