-
head
/tail
dovrà iterare quasi l'intero file (a seconda della posizione della riga che dai come parametro).
Quindi copi quel risultato in un nuovo file ed elimini quello vecchio. -
Non sono sicuro se
sed
itererà l'intero file ma è necessario copiare quel risultato in un nuovo file ed eliminare quello vecchio. Anche con-i
(al posto) crea un file temporaneo nascosto, quindi vale la stessa cosa.
Perché non spostare semplicemente il puntatore che punta alla prima riga del file e spostarlo sulla riga che vogliamo?
Come potremmo fare una cosa del genere? devo fare in C? C'è un altro modo?
Ha senso ?? sto pensando male? Se si perché?
Risposta accettata:
Perché non spostare semplicemente il puntatore che punta alla prima riga del file e spostarlo sulla riga che vogliamo?
Perché non esiste un "puntatore che punta alla prima riga del file".
Le operazioni di base per modificare un file sono:sovrascrivere un intervallo di byte (cioè sostituire una parte con dati della stessa lunghezza), aggiungere (cioè aggiungere alla fine), troncare (cioè rimuovere dalla fine).
La maggior parte dei filesystem memorizza i file in blocchi di dimensioni fisse, tranne per il fatto che l'ultimo blocco potrebbe essere parziale. Non c'è modo di modificare i dati in atto se la modifica cambia la dimensione di ciò che viene modificato, a meno che la modifica non sia alla fine o la modifica sposti i dati di un numero intero di blocchi. Spostare i dati di un numero intero di blocchi funzionerebbe solo per coincidenza e non esiste un'interfaccia diffusa¹ per farlo.
Il modo più efficiente per rimuovere i dati all'inizio di un file è copiare i dati che devono essere conservati in un nuovo file. Che è esattamente ciò che tail -n +42
o sed '41,$p'
fare.
¹ I moderni sistemi Linux hanno una chiamata di sistema per rimuovere una parte di un file:fallocate(fd, FALLOC_FL_COLLAPSE_RANGE, …)
, che puoi chiamare tramite l'utilità fallocate --collapse-range=…
. C'è anche FALLOC_FL_INSERT_RANGE
e --insert-range
. Ma sono limitati ai blocchi, il che li rende per lo più inutili per i file di testo e non sono disponibili con tutti i filesystem.