我想删除$rmv
一个名为 的巨大文本文件的第一行$filename
。这个文本文件太大了,我的硬盘上无法容纳两份副本。
以下内容给我留下了一个名为的空白文件$filename
:
tail -n +$rmv "$filename" > "$filename"
以下无法执行,因为我没有足够的存储空间来容纳$filename
和$filename.tmp
:
tail -n +$rmv "$filename" > "$filename.tmp" && mv "$filename.tmp" "$filename"
如果重要的话,我正在使用 Mac OS X El Capitan。
答案1
如果你有perl
:
{
tail -n +"$rmi"
perl -e 'truncate STDOUT, tell STDOUT'
} <file 1<>file
请注意,使用这种方法时,没有文件备份,因此任何损坏都会导致您丢失数据。
答案2
我认为ed
不使用临时文件,所以
ed bigfile <<ED_SCRIPT
1,${rmv}d
w
q
ED_SCRIPT
答案3
答案4
您的文本文件是 x MB,您没有 2* x MB,但我想您也没有足够的空间来压缩该文件?文本文件通常会压缩到原始大小的十分之一......
您没有足够的空间来容纳 ($total-$rmv) 行,但是如果它们被压缩怎么办?tail -n +$rmv "$filename" | gzip > "$filename.tmp" && zcat "$filename.tmp" > "$filename"
将此视为一个抽象的智力问题,我会将文件切成块,调整大小以适合内存或可用磁盘空间,从最后一个块开始,然后截断原始文件。我还可以使用诡计将文件压缩到位dd conv=notrunc
。
然而,在实践中,我要么
通过网络将文件复制到具有足够磁盘以容纳(仅)($total-$rmv)行的服务器,检查我是否获得了正确的行,删除原始文件,然后复制回来。
添加磁盘,因为您显然需要它。