Escreva no arquivo, mas substitua-o, se existir


252
echo "text" >> 'Users/Name/Desktop/TheAccount.txt'

Como faço para criar o arquivo se ele não existir, mas substitui-o se ele já existir. No momento, esse script apenas anexa.


bem ... isso é incrível. Eu reconheci> um pouco antes de >>.
Jokester

Respostas:


411

Um pouco de compreensão de como o * nix pipes funciona ajudaria.

Em suma, o >>operador de redirecionamento anexará linhas ao final do arquivo especificado, sendo que o único maior que >será vazio e substituirá o arquivo.

echo "text" > 'Users/Name/Desktop/TheAccount.txt'

9
Alguns ambientes não permitem algo assim -bash: TheAccount.txt: cannot overwrite existing file.
Tom Russell

16
Além disso, >e >>são os operadores de redirecionamento de saída . O operador do tubo é |.
Tom Russell

22
Ver resposta por @BrDaHa. Use >|para forçar a substituição existente
Jake

2
isso não é resposta correta em tudo, porque não vai substituir ficheiro existente
iWizard

4
A resposta deve ser atualizado com @ resposta de Jake a partir destes comentários, a resposta aceita é errada de várias maneiras
rm.rf.etc

90

No Bash, se você definiu noclobber a la set -o noclobber, usa a sintaxe>|

Por exemplo:

echo "some text" >| existing_file

Isso também funciona se o arquivo ainda não existir


  • Verifique se o noclobber está definido com: set -o | grep noclobber

  • Para uma explicação mais detalhada sobre esse tipo especial de operador, consulte esta postagem

  • Para uma lista mais completa de operadores de redirecionamento, consulte esta postagem


@estimulate você está usando o shell bash?
BrDaHa 02/07

@BrDaHa Como também posso redirecionar o stderr com> | também? Eu tentei &> | mas não funcionou.
Tu Bui

A @TuBui não sabe por que não está funcionando para você. Na minha máquina &>| filefunciona. Qual shell e versão você está usando? @stimulate para zsh ambos devem trabalhar , para a festança é única>|
Griddo

@Griddo meu shell é bash versão 4.3.48 (1) -release. echo "aaa" &>| test.txtresulta em erro -bash: syntax error near unexpected token |. Meu noclobber está ativado.
Tu Bui

1
@TuBui Aparentemente, eu não estava testando corretamente. Também não está funcionando para mim ... no entanto, a documentação não afirma que deveria ser possível de qualquer maneira. Você provavelmente precisa seguir echo "aaa" >| test.txt 2>&1ou usar outro shell.
Griddo 23/05/19

40

Apesar NylonSmileda resposta , que é "meio que" correta. Não foi possível sobrescrever arquivos dessa maneira.

echo "i know about Pipes, girlfriend" > thatAnswer

zsh: file exists: thatAnswer

para resolver meus problemas .. eu tive que usar ... >!, la la ..

[[ $FORCE_IT == 'YES' ]] && echo "$@" >! "$X" || echo "$@" > "$X"

Obviamente, tenha cuidado com isso ...


26
Isso significa que você tem a opção zsh não padrão NOCLOBBERdefinida. Use setopt clobber para restaurar o comportamento padrão.
Michał Politowski

11

Se o seu ambiente não permitir a substituição >, use pipe |e, teeem seguida, da seguinte maneira:

echo "text" | tee 'Users/Name/Desktop/TheAccount.txt'

Observe que isso também será impresso no stdout. Caso isso não seja desejado, você pode redirecionar a saída da /dev/nullseguinte maneira:

echo "text" | tee 'Users/Name/Desktop/TheAccount.txt' > /dev/null


2

Apenas observe que, se você deseja redirecionar std :: cerr e std :: cout para um arquivo enquanto estiver com o noclobber definido (ou seja set -o noclobber), poderá usar o código:

    cmd >|file.txt 2>&1

Mais informações sobre isso podem ser vistas em https://stackoverflow.com/a/876242 .

Também a pergunta desta resposta de @ TuBui sobre a resposta @BrDaHa fornecida acima em 9 de agosto de 18 às 9:34.


0

Para substituir o conteúdo de um arquivo para outro arquivo. use gato, por exemplo.

echo  "this is foo" > foobar.txt
cat foobar.txt

echo "this is bar" > bar.txt
cat bar.txt

Agora, para substituir o foobar, podemos usar um comando cat como abaixo

cat bar.txt >> foobar.txt
cat foobar.txt

insira a descrição da imagem aqui


"Agora, sobrescrever foobar ..." - >>é
anexado

-2

Se você possui uma saída que pode ter erros, convém usar um e comercial e maior que, da seguinte maneira:

my_task &> 'Users/Name/Desktop/task_output.log' isso redirecionará stderr e stdout para o arquivo de log (em vez de apenas stdout).


6
Isso pode ser verdade, mas não tem relação com a questão.
Deiwin #
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.