Shell script para compactação de múltiplos arquivos em múltiplos arquivos .zip

1. Shell script para compactação de múltiplos arquivos em múltiplos arquivos .zip

Iberê Miranda
iberesm

(usa Outra)

Enviado em 03/06/2019 - 15:58h

Boa tarde,
Estou com necessidade de um script que compacte arquivos em lote, porém que dê como resultado vários arquivos zip.
Por exemplo: 1234.jpeg, 12345.jpeg, 123456.jpeg compactados em 1234.zip, 12345.zip, 123456.zip


  


2. Re: Shell script para compactação de múltiplos arquivos em múltiplos arquivos .zip

Marcelo Oliver
msoliver

(usa Debian)

Enviado em 03/06/2019 - 19:53h


iberesm escreveu:

Boa tarde,
Estou com necessidade de um script que compacte arquivos em lote, porém que dê como resultado vários arquivos zip.
Por exemplo: 1234.jpeg, 12345.jpeg, 123456.jpeg compactados em 1234.zip, 12345.zip, 123456.zip

Segue sugestão:
for ARQ in $(ls -1 *.jpeg);do
#Para tirar o .jpeg, use: sed 's/\..*//' <<< $ARQ
Compacta $ARQ
done


Importante => echo -e "$(lynx --dump goo.gl/a9KeFc|sed -nr '/^[ ]+Se/,/dou.$/p')"
Att.: Marcelo Oliver


3. Re: Shell script para compactação de múltiplos arquivos em múltiplos arquivos .zip

Perfil removido
removido

(usa Nenhuma)

Enviado em 04/06/2019 - 20:17h

Caro iberesm,

Minha sugestão, em duas etapas:

Primeiro, ache os arquivos e pruduza uma lista deles.
Nesse exemplo, vamos procurar por todos os arquivos que tem ".jpg" no nome,
e aproveitando o comando find, vamos também executar o comando zip.

$  find -maxdepth 1 -iname '*.jpg' -print0 -execdir zip '{}'.zip '{}' \; 


Aqui, -maxdepth 1 significa que ele só vai procurar no nível da pasta atual,
sem procurar nos subdiretórios.

Geralmente o que é padrão e o que você quer é
foto.jpg --> foto.jpg.zip,
Mas vamos usar o sed para fazer pequenas alterações no nome dos arquivos:
Agora, teremos que procurar por ".jpg.zip" para não puxar as fotos originais juntas...

$  find -maxdepth 1 -iname '*.jpg.zip' -print0 | sed -ze "p;s/.jpg.zip/.ZIP/" | xargs -0 -n2 mv 

Vamos usar o xargs para não incorrer em problemas com caminho de pastas
com um espaço em branco..

Fiquei pensando na sua pergunta, e como ontem eu estava
estudando Bash, resolvi fazer esse script.

Se você rodar ele com os argumento ".jpg", ele vai achar todos
as fotos com essa extensão, ou "expressão regular", e fazer
um zip. rode com somente "--help" para Ajuda e mais instruções.

Espero que possa ser útil, mas com certeza esse script
ficou muito, muito maior do que *precisava*..

#!/bin/bash
#
# ZIPDE - procura e transforma arquivos em zip
# < v0.3 - 2019/06/10 >
# por naufragus88

## Termo de Garantia e Copyleft
WARRANTY_NOTICE="
\033[012;36mZIPDE - Procura e Transforma Arquivos em ZIP\033[00m
\033[012;31mCopyright (C) 2019 naufragus88

This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>.\033[00m
"
## Funções relativas ao Aviso de Copyright
## e acesso à GNU Public License versão 3
if [[ ${*} = "show w" ]];
then
echo -e "${WARRANTY_NOTICE}"
exit
elif [[ ${*} = "show c" ]] &&
ping -q -c1 8.8.8.8 > /dev/null;
then
curl --connect-timeout 10 --fail \
https://www.gnu.org/licenses/gpl-3.0.txt
printf "\n"
exit
elif [[ ${*} = "show c" ]] &&
! [[ $(wc -l "${0}") -lt "910" ]];
then
tail -680 "${0}" # | awk '{$1=""}1' | awk '{$1=$1}1'
exit
elif [[ ${*} = "show c" ]];
then
echo -e "${WARRANTY_NOTICE}"
exit
fi

## Manual de Instruções e Ajuda
HELP_LINES="
NOME:
\033[01;36mZIP-De - Procura e Transforma Arquivos em ZIP\033[00m


SINOPSE:
zipde.sh \033[012;32m[expressão regular]\033[00m \033[012;33m[-i|-r]\033[00m

zipde.sh \e[0;35;40m[-h|show c|show w|-s|-v]\033[00m

DESCRIÇÃO:
Procura por arquivos que tenham na finalização dos
seus nomes uma determinada expressão regular ( ER )
e converte esses arquivos para o formato Zip.
Os novos arquivos são cópias dos originais.

A ER, também entendida como \"padrão repetitivo\", deve:
I) Ser comum a todos arquivos e
II) Fazer parte da finalização do nome

Ex. \".jpg\", \".txt\"...

Para uma coleção de arquivos do tipo:

XXXX_(ZZ)-foo_bar.tar, YYYY_(ZZ)-foo_bar.tar
WWWW_(KK)-foo_bar.tar e YYYY_(KK)-foo_bar.tar

A ER deve conter alguns caracteres
como \".tar\" ou ainda \"-foo_bar.tar\"


Não é mais necessário inserir opção de englobamento \"*\"
(dito \"globbing\") antes da ER.
Englobamento está ativado por padrão.


Existe uma função extra que pode ser chamada avulsamente.
Ela faz a renomeação de parte dos nomes dos arquivos que
obedeçam o padrão de ER, sem a restrição posicional descrita
no parágrafo anterior.
A função de substituição de partes do nome é interativa
e tem explicações ao londo da utilização.

OPÇÕES:
As opções devem ser lançadas antes do começo da execução
deste script! Depois de iniciada a busca pela ER, não
é possível modificar as opções ( insensibilidade à capitulação
e recursividade de pastas ).

-h ou --help
Mostra esta ajuda.

-i Insensitivo à capitulação ( Ex. foo = FoO ).

-r Recursivo nos subdiretórios da pasta de partida.

show c Mostra a GPLv3.

show w Mostra o Termo de Garantia.

-s ou --subst
Ativa função de substituição parcial dos
nomes dos arquivos (não roda função de zip).

-v Mostra a versão do programa.

Observe que as opções \"-i\" e \"-r\" devem ser lançadas
depois da ER. Já as demais opções, devem ser lançadas
sozinhas ( \"show c/w\", \"-s\" e \"-v\" ).

BUGS:
Distribuido sem suporte e sem correção de bugs.
Licenciado sob a licança GLPv3\n
"

## Função extra para substituição parcial do nome de arquivos
subst_function() {
DEPTHZ=1
INAMEZ="-name"

printf "Por favor, escolha uma das seguintes opções:\n\n"
printf ' (1) Recursivo do diretório de partida;\n'
printf ' (2) Capitulização Insensível;\n'
printf ' (3) Ambas\n'
printf ' (Enter) Nenhuma\n'
printf ' (q) Cancelar\n'

read -r -n 1 -p "==>" option
case $option in
1 ) DEPTHZ=30
printf "\nOK.\n"
;;
2 ) INAMEZ="-iname"
printf "\nOK..\n"
;;
3 ) DEPTHZ=30
INAMEZ="-iname"
printf "\nOK...\n"
;;
q ) printf "\n"
exit
;;
* ) #printf "\nEscolha uma opção válida ou Ctrl-C para Cancelar\n"
esac

printf "\nDefina expressão regular para substituir:\n"
printf "==>"
read -r ER0
printf ""
printf "e pelo que será substituída.\n\n"
printf "==>"
read -r ER1

find . -maxdepth "${DEPTHZ}" -type f "${INAMEZ}" "*${ER0}*" -print0 |
sed -ze "p;s/${ER0}/${ER1}/" | xargs -0 -n2 mv
printf "Feito!\n"
exit
}

## Configurar Opções Gerais e do Usuário
INAME="-name"
DEPTH=1

if [[ -z ${*} ]];
then
printf "Rode com -h ou --help para Ajuda\n"
exit
elif [[ ${1} = "-h" || ${1} = "--help" ||
${2} = "-h" || ${2} = "--help" ||
${3} = "-h" || ${3} = "--help" ||
${4} = "-h" || ${4} = "--help" ]];
then
echo -e "$WARRANTY_NOTICE\n\
${HELP_LINES}" |
less
exit
elif [[ ${*} = "--subst" || ${*} = "-s" ]];
then
subst_function
elif [[ ${*} = "-v" ]];
then
head "${0}" | grep -e '# < v'
exit
elif [[ ${2} = "-i" && ${3} = "-i" ]] ||
[[ ${2} = "-r" && ${3} = "-r" ]] ||
[[ ${1} = "-r" || ${1} = "-i" ||
${1} = "-ri" || ${1} = "-ir" ]];
then
printf "Opções inválidas.\n"
exit
elif [[ ${2} = "-i" || ${3} = "-i" ]];
then
INAME="-iname"
elif [[ ${2} = "-r" || ${3} = "-r" ]];
then
DEPTH=30
elif [[ ${2} = "-ri" || ${3} = "-ir" ]];
then
INAME="-iname"
DEPTH=30
fi

## Checar pela presença do Zip no sistema
if ! command -v "zip" > /dev/null; then
printf "Pacote \"zip\" não encontrado no sistema.\n"
exit
fi

## Tenha certeza dos arquivos a serem zipados
printf "\nArquivos encontrados:\n\n"
find . -maxdepth "${DEPTH}" -type f "${INAME}" "*${1}" -print

printf "\nAviso: a expressão de busca deve conter\n"
printf " todo o final do nome dos arquivos,\n"
printf " incluindo sua extensão, se houver!\n"
printf " P. ex: \".jpg\"\n"
printf " digite \"h\" para mais Ajuda\n\n"

printf "\nProsseguir?\n"
read -r -p "s/N? ==>" choice
case "$choice" in
S|s ) ;;
N|n ) exit
;;
h|H ) help_lines
;;
* ) exit
esac

## Evitar deixar os arquivos com duas extensões
## e os arquivos zip espalhados pelos subdiretórios

# Cria novo diretório para os arquivos Zip criados
mkdir arq_zip
# Acha os arquivos com a ER os zipa
find . -maxdepth "${DEPTH}" -type f "${INAME}" "*${1}" -print0 \
-execdir zip "{}.ZIP" "{}" \;
# Reencontra novos arquivos zipados e move para pasta arq_zip
find . -maxdepth "${DEPTH}" -type f "${INAME}" "*${1}.ZIP" \
-exec mv -t "./arq_zip" {} +
# Retira as extensões antigas e adiciona somente ".zip"
find "./arq_zip" -maxdepth 1 -type f -iname "*${1}.ZIP" -print0 |
sed -ze "p;s/${1}.ZIP/.zip/" | xargs -0 -n2 mv
# Pronto
printf "\nArquivos zipados e movidos para \"./arq_zip\"\n"


## Referências e Deferências:
# https://stackoverflow.com/questions/4793892/recursively-rename-files-using-find-and-sed
# https://unix.stackexchange.com/questions/227662/how-to-rename-multiple-files-using-find
# https://unix.stackexchange.com/questions/154818/how-to-integrate-mv-command-after-find-command
# http://tldp.org/LDP/Bash-Beginners-Guide/html/sect_08_02.html
# https://unix.stackexchange.com/questions/63634/if-statement-with-2-variables-bash
# https://www.vivaolinux.com.br/topico/Shell-Script/Shell-script-para-compactacao-de-multiplos-arquivo...
#




4. Re: Shell script para compactação de múltiplos arquivos em múltiplos arquivos .zip

Perfil removido
removido

(usa Nenhuma)

Enviado em 04/06/2019 - 22:07h

Quem quiser, pode baixar a última versão do script por este endereço.:
https://drive.google.com/file/d/1GQ15ScrG6p98iLJw-6ZTcpbveUnlsCFa/view?usp=sharing

Basicamente, adicionei a GPL v3 no script, já que é software livre,
não custa nada a gente distribuir e fazer propaganda da GPL..
No mais, ele está rodando aqui tranquilamente.


5. Re: Shell script para compactação de múltiplos arquivos em múltiplos arquivos .zip

Paulo
paulo1205

(usa Ubuntu)

Enviado em 04/06/2019 - 23:22h

iberesm escreveu:

Boa tarde,
Estou com necessidade de um script que compacte arquivos em lote, porém que dê como resultado vários arquivos zip.
Por exemplo: 1234.jpeg, 12345.jpeg, 123456.jpeg compactados em 1234.zip, 12345.zip, 123456.zip


find . -maxdepth 1 -type f -iname \*.jpeg -print0 | \
while read -d $'\0' file; do
basename="${file#./}" # Remove o "./" do início do nome do arquivo (não chama programa externo).
no_suffix="${basename%.jpeg}" # Remove o sufixo ".jpeg" do nome do arquivo (não chama programa externo).
zip "${no_suffix}.zip" "${basename}" # Compacta.
done


Contudo, arquivos JPEG já costumam ter uma compressão bem grande. Você acha que vai ganhar muita coisa zipando-os?


... “Principium sapientiae timor Domini, et scientia sanctorum prudentia.” (Proverbia 9:10)






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts