我需要知道最快的方式可能,PHP或Linux的命令行界面,以减少已超过10行只有最后10行的文本文件。 我想用10行的这个例子。
谢谢 :)
我需要知道最快的方式可能,PHP或Linux的命令行界面,以减少已超过10行只有最后10行的文本文件。 我想用10行的这个例子。
谢谢 :)
以减少文件,它是最后再行做
tail -n 10 /path/to/file > /path/to/file.tmp && rm /path/to/file && mv /path/to/file.tmp /path/to/file
说明:
tail
输出最后n
一个文件的行。 >
将其写入文件。 &&
是链接命令。 rm
删除文件。 mv
重命名文件(或移动到不同的位置)。
如果你真的真的不想生成一个新的文件,那么你可以尝试
echo "$(tail -n 10 path/to/file)" >path/to/file
在$()
的作品就像反引号(它的计算结果无论是内部和相当于所述命令的输出),但它在字符串中更好地工作。 在我的Linux机器,该字符串被评估(意为tail
运行)的输出变为文件(这是什么原因与问题之前tail file >file
,该文件被打开-和截断-只要命令开始)。 我想这是因为 echo
是一个内置的,但不要可以引用我这句话。
编辑:其实,我带着一探究竟。 这是因为tail
是一个字符串。 有几个阶段 - 在这里,我们关心的有插值,重定向和执行 - 即总是以某些定义顺序发生(即,为了以防给出)。 而在插值字符串的过程中,Bash有在其内运行的命令。 之前的任何重定向完成。 用直tail file >file
,该tail
程序是实际产生的输出,所以直到执行该命令没有输出发生-但该文件的已经被打开之前正确的写(由于重定向),并打开该文件写作截断它。)
phase tail file >file echo "$(tail file)" >file
-------------+---------------------------------+-------------------------------
interpolate nothing run "tail file"; get output (+)
redirect open file for write; set stdout open file for write; set stdout
execute run "tail file" (*) run 'echo "line\nline\n..."'
(*)
请注意,由于file
已经打开由这点写,它现在被截断。 所以tail
读取0字节。
(+)
由于file
读取的重定向以写入模式打开之前 , tail
设法查看所有数据。
即使行为显然是定义和可预测的,这仍然感觉有点哈克给我。 它依赖于bash的奥秘,并很可能导致内存问题,如果你试图获得过多或过排长队。 (我用〜500条字符线测试,并没有发现任何问题,但还没有超过10行中进行过测试。)这很可能是更好的使用临时文件,除非您需要保留相同的inode编号一些奇怪的原因。
tail -n 10 yourfile > yourfile.tmp && mv yourfile.tmp yourfile
编辑专门给最后10行的文件可能低于10行更大。
在linux中,你可以做
tail -n 10 path/to/file > path/to/output/file
这将需要的最后十行的文件(-n后的值指定的行#),然后将它们添加到另一个文件。
如果你想覆盖现有文件,只有它的最后十行,然后做
tail -n 10 path/to/file > path/to/output/file && mv path/to/output/file path/to/file
注意与第一示例输出到不同的文件,而第二覆盖现有的文件。
您也可以通过使用EXEC()的shell命令里面,或者读取整个文件到一个数组与文件(),然后取数组的最后十个元素,加入他们更加费力的方式回到做到这一点在PHP用的fwrite()或类似的文件。