Erro ao chamar mv com curingas

3
#! /bin/bash

error_text=$(tail -n +1 /path/dir/folder/exc/a/update/Abd/ER/* | \
    grep 'Warning\|Loaded\|Event')
echo $error_text

nc 10.10.99.45 25 << EOF
ehlo mail.abc.pvt
mail from: [email protected]
rcpt to: [email protected]
data
subject: errors
$error_text
.
quit
EOF
mv Abc*.err /path/dir/folder/exc/a/update/Abd/ER/BkError/

O erro que recebo é

mv: cannot stat 'ACQ*.err': No such file or directory
    
por user3559774 10.06.2014 / 08:08

2 respostas

1

Ao invocar um programa com um caractere curinga, o shell que você está usando tentará expandir esse caractere curinga e fornecerá os nomes de arquivos expandidos como argumentos ao executável. Se não puder ser expandido, o shell fornecerá os caracteres curinga como nomes de arquivos ao processo.

Veja o seguinte strace output (os arquivos existem):

user@host:~$ mv test* /tmp/
execve("/bin/mv", ["mv", "test", "test1", "test2", "test3", "/tmp"], [/* 19 vars */]) = 0

Agora, esse strace output (nenhum arquivo correspondente ao curinga existe).

user@host:~$ mv test* /tmp/
execve("/bin/mv", ["mv", "test*", "/tmp/"], [/* 19 vars */]) = 0

Ao mover um arquivo com mv , o programa mv primeiro tenta obter o status do arquivo. Isso foi feito com um syscall stat (veja man 2 stat ). Se o status do arquivo (ou vários arquivos no seu caso) não puder ser reunido, o processo mv não poderá continuar.

No segundo caso, o syscall stat falha:

lstat("test*", 0x7fff20d26490)          = -1 ENOENT (No such file or directory)

Para encurtar uma história longa : Não existem arquivos que correspondam à declaração ACQ*.err .

    
por 10.06.2014 / 08:50
1

Quando um padrão de caractere curinga não corresponde a nenhum arquivo, o shell deixa inalterado.

Para evitar um erro espúrio, primeiro deixe as correspondências expandidas e, em seguida, verifique se o resultado é um arquivo inexistente.¹ Você pode definir os parâmetros posicionais (que normalmente contêm os argumentos passados para o script) na lista de arquivos.²

set -- Abc*.err
if [ -e "$1" ]; then
  mv "$@" /path/dir/folder/exc/a/update/Abd/ER/BkError/
fi

No bash, mas não no sh simples, você pode alterar a configuração para expandir padrões não correspondentes para a sequência vazia, em vez de deixá-los intactos.

shopt -s nullglob
err_files=(Abc*.err)
if ((${#err_files[@]} != 0)); then
  mv "${err_files[@]}" /path/dir/folder/exc/a/update/Abd/ER/BkError/
fi

¹ Isso pode levar a falsos positivos com padrões contendo […] . Para fins de integralidade, você também deve testar se a expansão é igual ao original.
² Veja “Como processar uma lista de nomes de arquivos” em Por que meu script de shell sufoca em espaços em branco ou outros caracteres especiais? para mais explicações.

    
por 11.06.2014 / 03:10