sed
crée un fichier temporaire, écrit la sortie dans ce fichier, puis renomme le fichier temporaire par-dessus l'original.
Vous pouvez regarder ce qui se passe en utilisant strace
:
$ strace -e trace=file sed -i -e '' a
execve("/usr/bin/sed", ["sed", "-i", "-e", "", "a"], [/* 34 vars */]) = 0
<...trimmed...>
open("a", O_RDONLY) = 3
open("./sedxvhRY8", O_RDWR|O_CREAT|O_EXCL, 0600) = 4
rename("./sedxvhRY8", "a") = 0
+++ exited with 0 +++
Cela enregistre toutes les opérations sur les fichiers sed
: il crée un nouveau fichier (en toute sécurité avec O_CREAT|O_EXCL
), y écrit les données, puis le remonte par-dessus mon fichier d'origine a
.
sed -i
accepte un suffixe à utiliser pour une sauvegarde, et dans ce cas, il déplace l'original à l'écart en premier (plutôt que de le renommer par-dessus). Cet argument est obligatoire dans la plupart des BSD sed
. Dans ce cas, il y a un bref moment où il n'y a aucun fichier du bon nom dans le répertoire.
perl
dans les versions récentes, ouvre le fichier d'entrée, puis le supprime et crée un nouveau fichier du même nom:
open("a", O_RDONLY) = 3
unlink("a") = 0
open("a", O_WRONLY|O_CREAT|O_EXCL, 0600) = 4
Lorsque vous supprimez ( unlink
) un fichier que vous avez déjà ouvert, vous conservez l'accès à celui-ci aussi longtemps que vous gardez la poignée, afin qu'il puisse continuer à lire les données du fichier supprimé. De cette façon, perl
écrit directement dans le fichier de sortie, plutôt que dans un fichier temporaire: aucun fichier supplémentaire n'est créé, mais si vous lisez le fichier pendant le processus, vous obtiendrez un contenu partiel, contrairement à sed
l'approche de. Il y a aussi un bref moment où il n'y a pas de fichier avec le bon nom, qui est au début du processus plutôt qu'à la fin (comme dans sed -i .bak
).
Les deux sed
et perl
:
- Remplacez un lien symbolique par un fichier ordinaire.
- Brisez les liens durs.
- Préservez la propriété du groupe si possible.
- Créez le fichier avec votre groupe par défaut (ou le groupe du répertoire parent si ce répertoire contient le
setgid
bit) s'il appartenait à un groupe dans lequel vous n'êtes pas et que vous n'êtes pas root.
- Préservez la propriété des fichiers si vous êtes root.
- Conserver les autorisations de base.
- Préserver
setuid
et setgrp
bits, si le groupe résultant est le même que le groupe dans lequel il a commencé.
- Conservez le peu collant.
- Ne préserve pas les xattrs.
sed
volonté:
- Préserver les ACL (sous Linux; je ne connais pas les autres) .
perl
volonté:
Ce qui précède est vrai sur Linux avec GNU sed
et Mac OS X avec son (dérivé de FreeBSD) sed
.