Como citar caracteres especiais (portáveis)
O snippet a seguir adiciona uma barra invertida antes de cada caractere especial em expressões regulares estendidas, usando sed
para substituir qualquer ocorrência de um dos caracteres ][()\.^$?*+
por uma barra invertida seguida por esse caractere:
raw_string='test[string]\.wibble'
quoted_string=$(printf %s "$raw_string" | sed 's/[][()\.^$?*+]/\&/g')
Isso removerá as novas linhas iniciais em $raw_string
; Se isso for um problema, certifique-se de que a string não termine com uma nova linha, adicionando um caractere inerte no final e, em seguida, tire esse caractere.
quoted_string=$(printf %sa "$raw_string" | sed 's/[][()\.^$?*+]/\&/g')
quoted_string=${quoted_string%?}
Como citar caracteres especiais (em bash ou zsh)
Bash e zsh têm um recurso de substituição de padrão, que pode ser mais rápido se a string não for muito longa. É complicado aqui porque a substituição deve ser uma string, então cada personagem precisa ser substituído separadamente. Note que você deve escapar as barras invertidas primeiro.
quoted_string=${raw_string//\//\\}
for c in \[ \] \( \) \. \^ \$ \? \* \+; do
quoted_string=${quoted_string//"$c"/"\$c"}
done
Como citar caracteres especiais (em ksh93)
A construção de substituição de string do Ksh é mais poderosa do que a versão diluída em bash e zsh. Suporta referências a grupos no padrão.
quoted_string=${raw_string//@([][()\.^$?*+])/\}
O que você realmente quer
Você não precisa de find
aqui: os padrões de shell são suficientes para corresponder aos arquivos que terminam com três dígitos. Se não houver nenhum arquivo de peça, o padrão glob será deixado sem expansão. Há também uma maneira mais simples de adicionar os tamanhos de arquivo: em vez de usar stat
(que existe em muitas variantes unix, mas tem uma sintaxe diferente em cada) e fazer pipelining complexo para somar os valores, você pode chamar wc -c
arquivos, na maioria dos sistemas, wc
examinará o tamanho do arquivo e não se incomodará em abrir o arquivo e ler os bytes).
set -- "$DESTINATION/$FILE_BASENAME".[0-9][0-9][0-9]
case $1 in
*\]) # The glob was left intact, so no part exists
do_split …;;
*) # The glob was expanded, so at least one part exists
FILE_SIZE_EXISTING=$(wc -c "$@" | sed -n '$s/[^0-9]//gp')
if [ "$FILE_SIZE_EXISTING" -ne "$(wc -c <"$DESTINATION/$FILE_BASENAME")" ]; then
do_split …
fi
Observe que o seu teste no tamanho total não é muito confiável: se o arquivo foi alterado, mas permaneceu do mesmo tamanho, você acabará com peças obsoletas. Tudo bem se os arquivos nunca mudarem e o único risco é que as partes possam estar truncadas ou ausentes.