Shell-Script

for循環中的tar命令

  • August 6, 2016

我知道這是基本問題,但請幫助我。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一個文件放入文件中server2.tar.gz。該文件將結束,只有一個文件。

使用 tar 選項附加文件:

tar --append -zcvf server2.tar.gz "$i"

或者只是將文件列表提供給 tar (請不要使用此命令):

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

但是,該命令行有一些問題:

  • 解析ls輸出(錯誤)。
  • 使用$Previousmonth未引用(錯誤)。
  • 建構可能包含嵌入空格的文件列表(不可靠)。

改用這個(一對)命令:

month=$(date "+%Y-%m-" --date '1 month ago')
find ./ -name "server.log.${month}*" -exec tar -zcvf server2.tar.gz '{}' \+

引用自:https://unix.stackexchange.com/questions/301680