Estatuto silencioso para verificar a existência do arquivo

1

Estou executando um comando se um arquivo estiver presente em uma linha do bash.

Aqui está o que estou fazendo por enquanto:

$ stat /last_dump.sql && mysql -D my_database < last_dump.sql

É o jeito certo de fazer?

Funciona bem, mas o relatório estatístico é enviado

  File: '/last_db.sql'
  Size: 42161       Blocks: 88         IO Block: 4096   regular file
Device: 26h/38d Inode: 108         Links: 1
Access: (0644/-rw-r--r--)  Uid: (    0/    me)   Gid: (    0/    me)
Access: 2016-06-08 08:07:15.886741191 +0000
Modify: 2016-06-08 08:07:06.218593606 +0000
Change: 2016-06-08 08:07:06.218593606 +0000
 Birth: -

Como posso não mostrar este relatório estatístico?

    
por Pierre de LESPINAY 08.06.2016 / 16:55

2 respostas

2

Você também pode usar operadores de teste de arquivos:

[[ -e ./last_dump.sql ]] && mysql -D my_database < ./last_dump.sql

Veja aqui mais informações sobre esses operadores: Operadores de teste de arquivo

Mas se você preferir usar stat , poderá desviar sua saída para /dev/null :

stat ./last_dump.sql >/dev/null && mysql -D my_database < ./last_dump.sql

Observe ./ nos comandos acima, o que significa diretório atual. Também devo observar que, se você quiser tornar o stat completamente silencioso (mesmo em caso de erros), desvie os erros para /dev/null , usando também &>/dev/null ou >/dev/null 2>&1 (tenha o mesmo resultado).

    
por 08.06.2016 / 17:03
1

A chamada de stat é útil apenas para obter informações que você não pode obter de comandos básicos do shell, como a hora ou as permissões de modificação de um arquivo. Para testar apenas a existência de um arquivo, use o comando test , também escrito [ . Este comando é construído na maioria das shells.

if [ -e last_dump.sql ]; then mysql -D my_database < last_dump.sql; fi

O teste -e testa se o arquivo especificado existe; o arquivo pode ser de qualquer tipo, incluindo links simbólicos quebrados. Se você quiser apenas arquivos regulares (incluindo links simbólicos para arquivos regulares), use -f .

Usar [ … ] é preferível a stat por vários motivos:

  • Chamar stat apenas para descartar sua saída é uma maneira ofuscada de testar se existe um arquivo. Pense nas pessoas que lerão o código (como você em seis meses): [ -e file ] diz claramente que "existe file ?", Enquanto chamando stat diz "me dê os metadados do arquivo" e testar a existência é apenas um efeito colateral.
  • [ … ] é um comando padrão, enquanto stat não existe em todas as variantes do Unix e possui opções de linha de comando incompatíveis onde existe. Neste caso específico, não é tão ruim porque você não está usando nenhuma opção de linha de comando.
  • stat é mais lento, pois é um comando externo.

Você também deve evitar usar && quando quiser dizer "se". Isso também é marcadamente menos legível. Também é menos robusto, pois sob set -e (dizendo ao shell para sair se algum programa quebrar), [ -e last_dump.sql ] && mysql … aborta o script se last_dump.sql não existir, enquanto if [ -e last_dump.sql ]; then …; fi continua.

    
por 09.06.2016 / 02:14

Tags