Verifique se o arquivo existe, não está vazio e igual a outro

0

Eu quero verificar se existe um arquivo, não está vazio e igual a outro arquivo. Se sim, não faça nada.

Se eles não forem iguais, sobrescreva os dois arquivos com cat "some text" .

Se eles não existirem ou estiverem vazios, crie também o arquivo com cat some text

Eu tentei algumas soluções, mas sempre que obtenho uma condição correta, outra falha ou falha quando não existem arquivos.

Qual seria a maneira mais limpa de resolver esse problema? Tudo isso usando bash?

    
por Freedo 03.11.2017 / 03:13

3 respostas

5
if [ -f file1 ] && [ -s file1 ] && [ -f file2 ] && [ -s file2 ] &&
    cmp file1 file2 &>/dev/null; then
    : do nothing in this case only
else
    echo "some text" >file1
    echo "some text" >file2 # or cp file1 file2
fi

e uma versão mais curta, com base nos comentários

if [ -s file1 ] && cmp file1 file2 &>/dev/null; then
    : do nothing in this case only
else
    echo "some text" >file1
    echo "some text" >file2 # or cp file1 file2
fi
    
por 03.11.2017 / 03:28
1

Eu faria um

if ! ( [[ -s file1 ]] && cmp file1 file2 2>/dev/null 1>&2 )
then
  echo "some text" >file1
  cp file1 file2
fi

Explicação:

-s arquivo1 é avaliado como verdadeiro se o arquivo1 existir e não estiver vazio.

O comando cmp define o código de status 0 se ambos os arquivos existirem e forem idênticos.

Este é o caso em que não queremos tocá-los, portanto prefixo-o por e ponto de exclamação, para negar a condição.

    
por 03.11.2017 / 08:08
1

Usando a opção cmp -s :

#!/bin/bash

if ! ( [[ -s file1 ]] && cmp -s file1 file2 )
then
    echo "some text" > file1
    cp file1 file2
fi

A opção -s descarta silenciosamente todas as saídas para stdout e stderr e apenas retorna o status de saída.

    
por 03.11.2017 / 14:13