2014-03-26 85 views
1

我有這個命令來連接匹配模式的文件,但我想刪除它們,並且我想防止剛剛創建的文件應該被刪除(而不是連接)的情況,連接文件並刪除源文件

示例文件名:

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 
+1

我認爲這是最好創建存儲文件的列表中的臨時文件(或VAR或其他)受到影響,然後與它的工作,既爲'cat'和'rm'。 – fedorqui

+1

你正試圖附加到一個文件名,該文件名將與你指定的'glob'匹配! (這會導致輸出文件附加到自身。) – devnull

+0

@devnull請參閱我的更新 – Pentium10

回答

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 
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

不需要臨時文件。

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

因爲它是可能的環帶超過一分鐘跑,我設置ts外循環,這樣在同一分鐘一直使用。如果需要不同的輸出文件,則可以在循環內移動該分配,具體取決於何時進行串聯。