'sed' atualiza as datas meta de todos os arquivos acessados

2

Eu usei sed -i 's/oldpat/newpat/g' ~/mydir/**/*.txt para substituir alguns str em alguns arquivos de texto.

No entanto, as datas modificadas de todos os arquivos, incluindo aquelas com conteúdo inalterado, foram alteradas para a data atual por sed e perdi as informações de tempo.

Existe alguma maneira de evitar a atualização das datas do arquivo ao usar sed ?

    
por Lee 19.10.2018 / 17:08

1 resposta

2

Infelizmente, parece que sed , com a opção -i , sempre cria um arquivo temporário (ênfase minha):

-i[SUFFIX]
--in-place[=SUFFIX]

This option specifies that files are to be edited in-place. GNU 'sed' does this by creating a temporary file and sending output to this file rather than to the standard output.(1).

This option implies -s.

When the end of the file is reached, the temporary file is renamed to the output file's original name. The extension, if supplied, is used to modify the name of the old file before renaming the temporary file, thereby making a backup copy(2)).

Isso significa que, mesmo que o conteúdo do arquivo não seja alterado por sed , o arquivo original será recriado.

Uma solução alternativa seria usar um script que usa grep para descobrir se o arquivo precisa da substituição antes de usar sed .

Um exemplo simples:

for FILE in ~/mydir/**/*.txt 
do
    if grep -q PATTERN "$FILE"; then
         sed -i 's/oldpat/newpat/g' "$FILE"
    fi
done

A alteração de -q para grep é usada para impedir que a saída da linha correspondente corresponda a stdout .

    
por 19.10.2018 / 17:14