我需要知道最快的方法,在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
解释:
CCD_ 1输出文件的最后一行CCD_。>
将其写入文件。&&
用于链接命令。rm
删除一个文件。mv
重命名文件(或移动到其他位置)。
如果您真的不想生成新文件,那么您可以尝试
echo "$(tail -n 10 path/to/file)" >path/to/file
$()
的工作原理与backticks一样(它评估内部的内容并等同于所述命令的输出),只是它在字符串中工作得更好。在我的Linux机器上,在输出进入文件之前,会对字符串进行求值(意味着tail
正在运行)(这就是tail file >file
出现问题的原因;一旦命令启动,文件就会被打开并截断) 我想这是因为tail
0是内置的,但不要引用我的话
编辑:实际上,我仔细看了一下。这是因为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
请注意,第一个示例输出到不同的文件,而第二个示例覆盖现有文件。
您也可以在PHP中使用exec()和shell命令,或者使用file()将整个文件读取到数组中,然后使用fwrite()或类似方法将数组的最后十个元素添加回文件中,这是一种更费力的方法。