我想将tail
文件的最后 100 行写入同一个文件,但该命令
tail -n 100 file > file
不起作用,我假设是因为在从原始文件读取所有内容之前,标准输出已写入“实时”文件。
有什么方法可以将输出传送到某物,然后保存它直到所有 100 行都存在,然后将其输出到文件?或者只是以这种方式缩短文件的另一种方法?
答案1
答案2
当然,当我最终在SE上问这个问题的那一刻,答案就出现了。我认为 less 可以满足我的需要,所以我只写:
tail -n 100 file | less > file
答案3
在:
tail -n 100 file > file
shell 分叉一个进程,打开file
并在其中写入,并进行截断(使其成为空文件),然后tail
在该进程中执行。要打开file
而不截断,您可以使用<>
重定向运算符:
tail -n 100 file 1<> file
但问题是根本不会有任何截断。也就是说,file
将被最后 100 行覆盖,但在这些100
行之后,文件中最初的内容仍然存在。因此,您需要在tail
完成后调用另一个命令来进行截断。
{ tail -n 100 file; perl -e 'truncate STDOUT, tell STDOUT'; } 1<> file
答案4
你可以这样做:
printf '%s\n' "$(tail -n 100 file)" > file