No hay suficiente espacio en disco: elimine las primeras n líneas de file de text sin copyr el file

Quiero eliminar las primeras líneas de $rmv de un gran file de text llamado $filename . Este file de text es tan grande que no puedo include dos copys en mi disco duro.

Lo siguiente me deja con un file en blanco llamado $filename :

 tail -n +$rmv "$filename" > "$filename" 

Lo siguiente no se puede ejecutar porque no tengo el espacio de almacenamiento para que coincida con $filename y $filename.tmp :

 tail -n +$rmv "$filename" > "$filename.tmp" && mv "$filename.tmp" "$filename" 

Si es importante, estoy usando Mac OS X El Capitan.

Solutions Collecting From Web of "No hay suficiente espacio en disco: elimine las primeras n líneas de file de text sin copyr el file"

Si tienes perl :

 { tail -n +"$rmi" perl -e 'truncate STDOUT, tell STDOUT' } <file 1<>file 

Tenga en count que con este enfoque, no hay una copy de security del file, por lo que cualquier corrupción hace que pierda sus datos.

Creo que ed no usa files temporales, entonces

 ed bigfile <<ED_SCRIPT 1,${rmv}d w q ED_SCRIPT 

Para ediciones de files con script, la herramienta de elección es ex .

 ex -sc "1,${rmv}d | x" "$filename" 

Es posible que también desee examinar la utilidad de split .

Su file de text es x MB, no tiene 2 * x MB, pero supongo que tampoco tiene suficiente espacio para comprimir el file. Los files de text a menudo se comprimen a una décima parte del tamaño original …

No tiene espacio suficiente para contener solo las líneas ($ total- $ rmv), pero ¿qué ocurre si están comprimidas? tail -n +$rmv "$filename" | gzip > "$filename.tmp" && zcat "$filename.tmp" > "$filename"

Tomando esto como un problema intelectual abstracto, cortaría el file en trozos, dimensionados para encajar en la memory o en el espacio disponible en el disco, comenzando con el último trozo y luego truncando el file original. También podría comprimir el file en su lugar utilizando dd conv=notrunc trickery.

Sin embargo, en la práctica, yo tampoco

  • copie el file a través de la networking a un server con suficiente disco para contener (solo) las líneas ($ total- $ rmv), verifique que obtuve las líneas correctas, elimine el file original y vuelva a copyr.

  • agregue disco, ya que obviamente lo necesita.