Unix: Comment puis-je append une sortie à un fichier?

Plus précisément, j’utilise une combinaison de >> et de tee dans un alias personnalisé pour stocker les nouvelles mises à jour Homebrew dans un fichier texte, ainsi que les résultats à l’écran:

 alias bu="echo `date "+%Y-%m-%d at %H:%M"` \ >> ~/Documents/Homebrew\ Updates.txt && \ brew update | tee -a ~/Documents/Homebrew\ Updates.txt" 

Question : Que faire si je souhaite append cette sortie dans mon fichier texte, c’est-à-dire placée au début du fichier plutôt que de l’append à la fin?


Edit1 : Comme quelqu’un l’a signalé dans les réponses ci-dessous, l’utilisation de fichiers temporaires peut être une bonne approche, ce qui m’a aidé au moins partiellement:

 targetLog="~/Documents/Homebrew\ Updates.txt" alias bu="(brew update | cat - $targetLog \ > /tmp/out1 && mv /tmp/out1 $targetLog \ && echo `date "+%Y-%m-%d at %H:%M":%S` | \ cat - $targetLog > /tmp/out2 \ && mv /tmp/out2 $targetLog)" 

Mais le problème est la sortie vers STDOUT (précédemment rendue possible par tee), que je ne suis pas sûr de pouvoir incorporer dans cette approche par fichier temporaire …?

sed le fera volontiers pour vous, en utilisant -i pour éditer en place, par exemple.

 sed -i -e "1i `date "+%Y-%m-%d at %H:%M"`" some_file 

Cela fonctionne en créant un fichier de sortie:

Disons que nous avons le contenu initial sur fichier.txt

 echo "first line" > file.txt echo "second line" >> file.txt 

Ainsi, file.txt est notre fichier texte “en bas”. Maintenant ajouté à un nouveau fichier de sortie

 echo "add new first line" | cat - file.txt > output.txt # <--- Just this command 

Maintenant, la sortie a le contenu comme nous le souhaitons. Si vous avez besoin de votre ancien nom:

 mv output.txt file.txt cat file.txt 

Le seul moyen simple et sûr de modifier un fichier d’entrée en utilisant les outils bash, consiste à utiliser un fichier temporaire, par exemple. sed -i utilise un fichier temporaire en arrière-plan (mais pour être robuste, sed besoin de plus).

Certaines des méthodes utilisées ont un piège subtil “peut casser les choses” lorsque, plutôt que d’exécuter votre commande sur le fichier de données réel , vous l’exécutez sur un lien symbolique (vers le fichier que vous souhaitez modifier). À moins d’être correctement pris en charge, cela peut casser le lien et le convertir en un fichier réel qui reçoit les mods et laisse le fichier réel d’ origine sans les mods voulus et sans le lien symbolique (pas de résultat de code de sortie d’erreur)

Pour éviter cela avec sed , vous devez utiliser l’option --follow-symlinks .
Pour les autres méthodes, sachez qu’il doit suivre les liens symboliques (lorsque vous agissez sur un tel lien)
En utilisant un fichier temporaire, le fichier temporaire rm temp file fonctionne que si “fichier” n’est pas un lien symbolique.

Un moyen sûr est d’utiliser une sponge du paquet moreutils

Contrairement à une redirection de shell, l’éponge absorbe toutes ses entrées avant d’ouvrir le fichier de sortie. Cela permet de construire des pipelines qui lisent et écrivent dans le même fichier.

sponge est un bon moyen de gérer ce type de situation.

Voici un exemple, en utilisant une sponge

 hbu=~/'Documents/Homebrew Updates.txt' { date "+%Y-%m-%d at %H:%M"; cat "$hbu"; } | sponge "$hbu" 

De la manière la plus simple, IMO utiliserait echo et cat:

 echo "Prepend" | cat - inputfile > outputfile 

Ou pour votre exemple, remplacez le tee -a ~/Documents/Homebrew\ Updates.txt par cat - ~/Documents/Homebrew\ Updates.txt > ~/Documents/Homebrew\ Updates.txt

Edit: Comme indiqué par hasturkun cela ne fonctionnera pas, essayez:

 echo "Prepend" | cat - file | tee file 

Mais ce n’est pas la manière la plus efficace de le faire plus …

Essayez ceci http://www.unix.com/shell-programming-scripting/42200-add-text-beginning-file.html Il n’y a pas d’opérateur direct ou de commande AFAIK.Vous utilisez echo, cat et mv pour obtenir l’effet .

 { date; brew update |tee /dev/tty; cat updates.txt; } >updates.txt.new mv updates.txt.new updates.txt 

Je ne sais pas pourquoi vous voulez faire ça. Il est assez courant que des journaux comme celui-ci aient des entrées ultérieures, bien, plus tard dans le fichier.