将文件内容复制到Linux中的新文件中

时间:2012-06-29 13:05:12

标签: linux

我想知道如何将文件(server.log)的所有内容复制到新文件,并使用Linux命令从原始文件中删除内容。实际上这很容易。但我确实希望确保在该操作中不会有内容更新。以下Linux命令执行我想要的操作,但我必须确保在command1-command2执行之间server.log没有任何更改。

command1: #cp server.log serverNew.log 
command2: #truncate -l 0 server.log

5 个答案:

答案 0 :(得分:4)

我会使用专门为此目的而构建的工具,而不是使用一些临时解决方案。

看看logrotate。您可以直接使用该命令或在cron作业中进行设置。

它支持压缩,每次旋转后运行命令,根据大小或时间等旋转......

根据您在下面的评论,我假设您对以下选项感兴趣:

postrotate/endscript

在旋转日志文件后,将执行postrotateendscript之间的行(两者必须单独出现在行上)(使用/bin/sh)。这些指令可能只出现在日志文件定义中。 通常,日志文件的绝对路径作为第一个参数传递给脚本。如果指定了sharedscripts,则将整个模式传递给脚本。另见prerotate。有关错误处理,请参阅sharedscriptsnosharedscripts

prerotate/endscript

prerotateendscript之间的行(两者必须单独出现在行上)在日志文件旋转之前执行(使用/bin/sh)并且仅在日志将执行时实际上是旋转的。这些指令可能只出现在日志文件定义中。 通常,日志文件的绝对路径作为第一个参数传递给脚本。如果指定了sharedscripts,则将整个模式传递给脚本。另见postrotate。有关错误处理,请参阅sharedscriptsnosharedscripts

答案 1 :(得分:0)

不要复制,重命名(使用mv)。重命名在文件系统级别是原子的,因此编写具有旧名称的文件的任何应用程序都不会发生冲突。

答案 2 :(得分:0)

之后,您可以使用触摸命令确保

command3: #touch server.log

答案 3 :(得分:0)

您可以串联使用这些命令:cp oldFile newFile; cat '' >> oldFile
cp复制您的文件。第二个命令,即第一个执行,用于覆盖原始文件

显然,如果您的“程序”(或脚本)在将旧文件的内容复制到新文件后将运行,请以写入方式打开文件(而不是写入并追加)命令是没有必要的 此外,对于>>重定向,您必须验证noclobber选项是否设置为“关闭”(1)

答案 4 :(得分:0)

这是一个简单的C应用程序,它可能(可能)做你想做的事情:

#include <stdlib.h>
#include <stdio.h>
#include <sys/file.h>

void main (int argc, char** argv)
{
    if (argc != 2)
        exit(1);

    FILE* fi = fopen(argv[1], "rb+");
    FILE* fo = fopen(argv[2], "wb");

    if (fi != NULL && fo != NULL && flock(fi, LOCK_EX) == 0)
    {
        while (feof(fi) == 0)
        {
            char* buf = malloc(4096);
            int bRead = 0;
            bRead = fread(buf, 1, 4096, fi);
            fwrite(buf, 1, bRead, fo);
        }

        frewind(fi);
        fputc(10, fi);

        flock(fi, LOCK_UN);
        fclose(fi);
        fclose(fo);
    }
else exit(1);

exit(0);
}

请致电:./a.out oldfile newfile

警告:我实际上没有对此代码进行过测试,请确保进行一些测试,然后再将其用于任何重要工作。

或者,您也可以尝试使用shell工具flockhttp://linux.die.net/man/1/flock