Une autre approche - cp
le site /dev/null
dans le fichier
xieerqi:$ cat testFile.txt
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/sda1 115247656 83100492 26269816 76% /
none 4 0 4 0% /sys/fs/cgroup
udev 2914492 4 2914488 1% /dev
tmpfs 585216 1152 584064 1% /run
none 5120 0 5120 0% /run/lock
none 2926072 98096 2827976 4% /run/shm
none 102400 76 102324 1% /run/user
xieerqi:$ cp /dev/null testFile.txt
xieerqi:$ cat testFile.txt
xieerqi:$
Pourquoi cela fonctionne-t-il et comment cela fonctionne-t-il ? Le site testFile.txt
sera ouvert avec O_WRONLY|O_TRUNC
ce qui signifie que si le fichier existe, il sera tronqué, c'est-à-dire que son contenu sera supprimé et sa taille mise à zéro. C'est le même drapeau avec lequel >
dans Shell ouvre le fichier à droite de cet opérateur.
Suivant, cp
tentera de lire à partir de /dev/null
et après avoir lu 0 octet, fermera simplement les deux fichiers, laissant ainsi testFile.txt
tronqué et le contenu effectivement supprimé.
Sachant cela, nous pourrions en théorie utiliser tout ce qui nous permet d'ouvrir un fichier avec O_TRUNC
. Par exemple, ceci :
dd of=testFile.txt count=0
La petite différence ici est que dd
n'effectuera aucune read()
du tout. Gros avantage de ceci dd
est qu'elle est portable POSIX. Le site spécifications du dd l'État :
Si la conversion seek= expr n'est pas également spécifiée, le fichier de sortie sera tronqué avant le début de la copie si un opérande explicite of= file est spécifié, à moins que conv= notrunc ne soit spécifié.
En revanche cp /dev/null testFile.txt
n'est pas nécessairement portable, puisque Spécifications POSIX pour cp couvre ce qui se passe seulement si le fichier source est non-régulier et quand -r
/ -R
sont spécifiés (un grand merci à Stephen Kitt pour l'avoir souligné), mais pas ce qui se passe lorsque -r
o -R
sont omises, ce qui est le cas ici. Cependant, il semble qu'au moins GNU cp
utilise par défaut la règle 3 de la même spécification, qui consiste à tronquer le fichier existant sans changer son type.