2017-02-10 86 views
1

我想要一個腳本來壓縮「logs」目錄(Sandbox/tmp/logs)中的所有文件(使用tar)。不知道我哪裏錯了,但它正在壓縮所有的文件,目錄和路徑。我不想要的。我只想壓縮「日誌」目錄中的文件。任何幫助將不勝感激。僅壓縮文件

這裏是我的代碼:

#!/bin/bash 

LOG_FILES="/Sandbox/tmp/logs" 

for file in ${LOG_FILES}/* ; do 
    tar -cvzf "${file}.tar.gz" "$file" 
done 

回答

1

我不是你的要求完全清楚,但我覺得的問題是,你提供太多的路徑信息焦油。比方說你有下列文件:

/Sandbox/tmp/logs/foo 
/Sandbox/tmp/logs/bar 
/Sandbox/tmp/logs/baz 

你有什麼將基本運行以下命令:

tar -cvzf "/Sandbox/tmp/logs/foo.tar.gz" "/Sandbox/tmp/logs/foo" 
tar -cvzf "/Sandbox/tmp/logs/bar.tar.gz" "/Sandbox/tmp/logs/bar" 
tar -cvzf "/Sandbox/tmp/logs/baz.tar.gz" "/Sandbox/tmp/logs/baz" 

注意如何將所有的路徑都包括在內; tar試圖在存檔中保留路徑,這樣當你提取一個tar包時,所有東西都會被重建(例如,如果你想壓縮foo/bar.txtbaz.txt,當你提取它們時,你可能想要bar.txt位於foo子目錄中)。

來解決這個問題最簡單的辦法是剛剛擺脫的路徑...更改目錄到/Sandbox/tmp/logs外循環應該做的伎倆:

#!/bin/bash 

LOG_FILES="/Sandbox/tmp/logs" 

cd "${LOG_FILES}" 

for file in * ; do 
    tar -cvzf "${file}.tar.gz" "$file" 
done 

有了,你會用下列新的結束文件:

/Sandbox/tmp/logs/foo.tar.gz 
/Sandbox/tmp/logs/bar.tar.gz 
/Sandbox/tmp/logs/baz.tar.gz 

但是,你現在還在/Sandbox/tmp/logs,在你的腳本可以是一個問題後。爲了解決這個問題,你可以使用一個子shell:

#!/bin/bash 

LOG_FILES="/Sandbox/tmp/logs" 

(cd "${LOG_FILES}"; 
for file in * ; do 
    tar -cvzf "${file}.tar.gz" "$file" 
done) 

現在,所有的說,你真的不需要使用焦油壓縮單個文件。相反,您可以直接使用gzip;你可以節省幾個字節,並gzip默認創建文件旁邊的輸入,這樣你就可以擺脫cd克魯夫特的:

#!/bin/bash 

LOG_FILES="/Sandbox/tmp/logs" 

for file in "${LOG_FILES}"/*; do 
    gzip -k "$file" 
done 

這將產生

/Sandbox/tmp/logs/foo.gz 
/Sandbox/tmp/logs/bar.gz 
/Sandbox/tmp/logs/baz.gz 

而且gzip將愉快地壓縮多個輸入到多個輸出,所以如果你想要一個班輪你可以只用

gzip -k "${LOG_FILES}"/* 

去而且,如果y你有GNU並行安裝,你可以並行壓縮文件,如

parallel gzip -k ::: /Sandbox/tmp/logs/*