Para verificar a existência de arquivos correspondentes a um padrão,
você pode fazer algo parecido com
if [ "$(shopt -s nullglob; printf "%s" "$WORK"/*"$PRCSID".unl)" != "" ]
then
tar -cvzf "$WORK/INET_$PRCSID.unl.gz" "$WORK"/*"$PRCSID".unl
fi
(suponho que você não pretendesse procurar em um só lugar por .unl
arquivos
e, em seguida, arquive os arquivos de outro lugar.)
shopt -s nullglob
faz com que padrões de nome de arquivo sejam "expandidos" para nada
quando eles não correspondem nada, então, se não houver arquivos com nomes terminando
com 123.unl
no diretório de trabalho,
o argumento da string "$WORK"/*"$PRCSID".unl
desaparece,
deixando printf
sem nada para imprimir.
Notas:
- Você pode trazer o
shopt -s nullglob
para fora da instrução if
, por exemplo,
shopt -s nullglob # Maybe elsewhere in the script
⋮
if [ "$(printf "%s" "$WORK"/*"$PRCSID".unl)" != "" ]
then
tar -cvzf "$WORK/INET_$PRCSID.unl.gz" "$WORK"/*"$PRCSID".unl
fi
se você estiver disposto a ter esse comportamento
(a expansão nula de padrões não correspondentes)
na verdade, através da execução do script.
- Você deve sempre citar as variáveis do shell (por exemplo,
"$WORK"
e "$PRCSID"
)
a menos que você tenha uma boa razão para não
e você está certo de que sabe o que está fazendo.
Você pode fazê-las por partes, citando apenas as variáveis, por exemplo,
"$WORK"/*"$PRCSID".unl and "$WORK"/INET_"$PRCSID".unl.gz
ou você pode citar palavras inteiras que contêm variáveis, por exemplo,
"$WORK/"*"$PRCSID.unl" and "$WORK/INET_$PRCSID.unl.gz"
mas note que você não deve fazer "$WORK/*$PRCSID.unl"
,
porque isso inclui o *
entre aspas e, assim, impede que ele aja
como um padrão de expansão de nome de arquivo (ou seja, curinga ou glob).
- Desde o início do seu padrão de nome de arquivo
com um nome de diretório que você tem algum controle sobre -
especialmente se for um caminho completo (começando com
/
) ou você pode pelo menos
garantir que não comece com -
) -
então provavelmente você está seguro usando echo
em vez de printf "%s"
; ou seja,
if [ "$(shopt -s nullglob; echo "$WORK"/*"$PRCSID".unl)" != "" ]
then
tar -cvzf "$WORK/INET_$PRCSID.unl.gz" "$WORK"/*"$PRCSID".unl
fi
e, claro, você pode puxar o shopt -s nullglob
da declaração if
aqui também.
Outra abordagem
Se você tiver um if
- then
- else
(ou pelo menos um if
- then
),
Por exemplo, para escrever mensagens de status / log / erro, você provavelmente deve usar as opções acima.
Mas, se sua única preocupação é executar o comando tar
somente se houver arquivo (s) lá,
você pode dispensar o if
- then
e apenas fazer
(shopt -s failglob; tar -cvzf "$WORK/INET_$PRCSID.unl.gz" "$WORK"/*"$PRCSID".unl)
shopt -s failglob
significa que, se um comando for tentado
com um argumento contendo padrões de nome de arquivo que não correspondem a nada,
o comando não é executado .
O acima mencionado alcança precisamente o efeito
que o código da sua pergunta está tentando alcançar:
execute o comando tar
se houver arquivos com nomes terminando com 123.unl
no diretório de trabalho, e não, se não houver nenhum.
Novamente, você pode separar o comando shopt -s failglob
do tar
, por exemplo,
shopt -s failglob # Maybe elsewhere in the script
⋮
tar -cvzf "$WORK/INET_$PRCSID.unl.gz" "$WORK"/*"$PRCSID".unl
se você estiver disposto a ter esse comportamento (a não execução de comandos
com padrões não correspondentes) em vigor durante a execução do script.