连接文件并删除源文件

时间:2014-03-26 10:32:42

标签: linux shell ubuntu centos

我有这个命令来连接匹配模式的文件,但我确实要删除它们,我想防止刚刚创建的文件应该被删除(并且没有连接)的情况

示例文件名:

start-2014-03-25-08-08.log
scheduled-2014-03-19-13-03.log
scheduled-2014-03-19-14-58.log

使用的命令

ls -1 | sed -r "s/(.*)-[0-9]{4}(-[0-9]{2})+/cat \1* >> \1$(date  +"-%Y-%m-%d-%H-%M")/" | uniq | cat

输出是:

cat start* >> start-2014-03-26-12-26.log
cat scheduled* >> scheduled-2014-03-26-12-26.log

但我确实想要在附加文件后将其删除。由于文件很大,可能会有一点延迟,同时会创建一个新的“保存模式”文件,我不想删除那个文件。

什么是正确的方法?

更新

我现在有这个。

 rm -f temp.files;ls -1 *.log > temp.files; cat temp.files | sed -r "s/(.*)-[0-9]{4}(-[0-9]{2})+\.log/cat \1* >> \1$(date  +"-%Y-%m-%d-%H-%M").log/" | uniq | sh; xargs rm -rf < temp.files; rm -f temp.files

3 个答案:

答案 0 :(得分:1)

由于您使用cat生成了sed命令,然后将其移至sh,因此您可以修改sed表达式,以指示sh如果成功附加文件,则删除该文件,即将替换表达式更改为:

cat \1* >> \1$(date  +"-%Y-%m-%d-%H-%M").log \&\& rm -f &

cat \1* >> \1$(date  +"-%Y-%m-%d-%H-%M").log

请注意,您需要转义替换中的&才能生成文字&&本身就是整个匹配(在您的情况下为输入文件名) 。

这也可以避免在命令中rm -rf < temp.files的需要,因为每个文件在被追加后都会被删除。

答案 1 :(得分:1)

不需要临时文件。

ts=$(date +"-%Y-%m-%d-%H-%M")
for f in *; do
    prefix=${f%%-*}
    cat "$f" >> "$prefix-$ts"
    rm "$f"
done

由于循环可能需要超过一分钟才能运行,因此我在循环外设置ts,以便始终使用相同的分钟。如果您需要不同的输出文件,则可以在循环内移动该分配,具体取决于实际进行连接的时间。

答案 2 :(得分:0)

最后我有了这个:

 rm -f temp.files;ls -1 *.log > temp.files; cat temp.files | sed -r "s/(.*)-[0-9]{4}(-[0-9]{2})+\.log/cat \1* >> \1$(date  +"-%Y-%m-%d-%H-%M").log/" | uniq | sh; xargs rm -rf < temp.files; rm -f temp.files