我有这个命令来连接匹配模式的文件,但我确实要删除它们,我想防止刚刚创建的文件应该被删除(并且没有连接)的情况
示例文件名:
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
答案 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