É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é.


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'

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


@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 ...


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


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.


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


"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).


6
C'est peut-être vrai, mais cela n'a rien à voir avec la question.
Deiwin
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.