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...
#