2016-08-06 45 views
1

我知道這是基本的問題,但請你幫我.I壓縮,用tar命令使用「焦油」命令循環

for i in server.log.2016-07-05 server.log.2016-07-06 ; do tar -zcvf server2.tar.gz $i; done 

上述循環的輸出是存檔我的服務器日誌文件:

server.log.2016-07-05 
server.log.2016-07-06 

但同時列出使用tar -tvf server2.tar.gz獲得的輸出文件是:

rw-r--r-- root/root 663643914 2016-07-06 23:59 server.log.2016-07-06 

我。即,我存檔了兩個文件,但只顯示了一個文件,這意味着存檔不具備這兩個文件對嗎?請幫助。

我剛剛測試過這兩個文件,但我的文件夾有多個文件。由於我沒有得到預期的輸出,我沒有處理文件夾中的所有文件。確切的循環,我要使用方法是:

Previousmonth=$(date "+%b" --date '1 month ago') 

for i in $(ls -l | awk '/'$Previousmonth'/ && /server.log./ {print $NF}');do;tar -zcvf server2.tar.gz $i;done 

我試圖壓縮和歸檔多個文件,但同時使用tar -tvf它沒有顯示所有文件列表中的文件。

回答

1

這裏你不需要循環。只列出所有你想要添加作爲命令行參數的文件:

tar -zcvf server2.tar.gz server.log.2016-07-05 server.log.2016-07-06 

這同樣適用於其他範例太:

tar -zcvf server2.tar.gz $(ls -l | awk '/'$Previousmonth'/ && /server.log./ {print $NF}') 

除了解析的ls -l輸出是可怕的,強烈不推薦。

但由於文件名來備份包含月份數, 一個更簡單,更好的辦法是使用date命令獲取年+月數,然後使用shell通配:

prefix=$(date +%Y-%m -d 'last month') 
tar -zcvf server2.tar.gz server.log.$prefix-?? 
+0

感謝回覆,你提到的兩個命令都有效,但我們計劃使用crontab來執行它。所以''find'方法在所有的月份中都要提及日期(2016-xx-xx)。那麼什麼是歸檔解決方案並壓縮而不是'ls -l' – karthikraj

+0

如果日誌文件的名稱與您的示例一致,那麼您不需要'ls'或任何其他命令。使用簡單的shell通配符查看我更新的解決方案。 – janos