Écrire dans un fichier, mais l'écraser s'il existe

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

Comment puis-je le faire pour qu'il crée le fichier s'il n'existe pas, mais l'écrase s'il existe déjà. À l'heure actuelle, ce script est simplement ajouté.

switz
la source
bien .. c'est génial. J'ai reconnu> un peu plus tôt que >>.
Jokester

Réponses:

411

Un peu de compréhension du fonctionnement des tuyaux * nix serait utile.

En bref, l' >>opérateur de redirection ajoutera des lignes à la fin du fichier spécifié, où-comme le simple supérieur à >videra et écrasera le fichier.

echo "text" > 'Users/Name/Desktop/TheAccount.txt'
Sourire en nylon
la source
9
Certains environnements interdisent quelque chose comme -bash: TheAccount.txt: cannot overwrite existing file.
Tom Russell
16
En outre, >et >>sont les opérateurs de redirection de sortie . L'opérateur de tuyaux est |.
Tom Russell
22
Voir la réponse de @BrDaHa. Utiliser >|pour forcer l'écrasement existant
Jake
2
ce n'est pas du tout la bonne réponse car elle
n'écrasera
4
La réponse doit être mise à jour avec la réponse de @ Jake à partir de ces commentaires, la réponse acceptée est erronée de plusieurs manières
rm.rf.etc
90

Dans Bash, si vous avez défini noclobber à la set -o noclobber, vous utilisez la syntaxe>|

Par exemple:

echo "some text" >| existing_file

Cela fonctionne également si le fichier n'existe pas encore


  • Vérifiez si le noclobber est défini avec: set -o | grep noclobber

  • Pour une explication plus détaillée sur ce type d'opérateur spécial, voir cet article

  • Pour une liste plus exhaustive des opérateurs de redirection, reportez-vous à cet article

BrDaHa
la source
@stimulate utilisez-vous le shell bash?
BrDaHa
@BrDaHa Comment puis-je également rediriger stderr avec> | ainsi que? J'ai essayé &> | mais ça n'a pas marché.
Tu Bui
@TuBui ne sais pas pourquoi cela ne fonctionne pas pour vous. Sur ma machine &>| filefonctionne. Quel shell et quelle version utilisez-vous? @stimulate for zsh both should work , for bash it's only>|
Griddo
@Griddo mon shell est la version bash 4.3.48 (1) -release. echo "aaa" &>| test.txtentraîne une erreur -bash: syntax error near unexpected token |. Mon noclobber est activé.
Tu Bui
1
@TuBui Apparemment, je ne testais pas correctement. Cela ne fonctionne pas non plus pour moi ... mais la documentation n'indique pas que cela devrait être possible de toute façon. Vous devez probablement vous en tenir à echo "aaa" >| test.txt 2>&1ou utiliser un autre shell.
Griddo
40

Malgré NylonSmilela réponse de , qui est "en quelque sorte" correcte .. Je n'ai pas pu écraser les fichiers de cette manière ..

echo "i know about Pipes, girlfriend" > thatAnswer

zsh: file exists: thatAnswer

pour résoudre mes problèmes .. je devais utiliser ... >!, á la ..

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

Évidemment, soyez prudent avec cela ...

Alex Gray
la source
26
Cela signifie que vous avez NOCLOBBERdéfini l' option zsh non par défaut . Utilisez setopt clobber pour restaurer le comportement par défaut.
Michał Politowski
11

Si votre environnement ne permet pas d'écraser avec >, utilisez plutôt pipe |et teecomme suit:

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

Notez que cela s'imprimera également sur la sortie standard. Si cela n'est pas souhaité, vous pouvez rediriger la sortie /dev/nullcomme suit:

echo "text" | tee 'Users/Name/Desktop/TheAccount.txt' > /dev/null
informaticien
la source
6
#!/bin/bash

cat <<EOF > SampleFile

Put Some text here 
Put some text here
Put some text here

EOF
Balaji Boggaram Ramanarayan
la source
2

Notez simplement que si vous souhaitez rediriger à la fois std :: cerr et std :: cout vers un fichier alors que vous avez défini noclobber (c'est-à-dire set -o noclobber), vous pouvez utiliser le code:

    cmd >|file.txt 2>&1

Plus d'informations à ce sujet peuvent être consultées sur https://stackoverflow.com/a/876242 .

Aussi la réponse de @ TuBui à cette réponse sur la réponse @BrDaHa fournie ci-dessus le 9 août 18 à 9:34.

greensaxman
la source
0

Pour remplacer le contenu d'un fichier dans un autre fichier. utiliser chat par exemple.

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

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

Maintenant, pour remplacer foobar, nous pouvons utiliser une commande cat comme ci-dessous

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

entrez la description de l'image ici

Narendra Maru
la source
"Maintenant, écraser foobar ..." - l' >>ajoute, pas l'écrasement
Drenai
-2

Si vous avez une sortie qui peut contenir des erreurs, vous pouvez utiliser une esperluette et une plus grande que, comme suit:

my_task &> 'Users/Name/Desktop/task_output.log' cela redirigera à la fois stderr et stdout vers le fichier journal (au lieu de stdout uniquement).

codage aaron
la source
6
C'est peut-être vrai, mais cela n'a rien à voir avec la question.
Deiwin