我想要一個腳本來壓縮「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
我想要一個腳本來壓縮「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
我不是你的要求完全清楚,但我覺得您的問題是,你提供太多的路徑信息焦油。比方說你有下列文件:
/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.txt
和baz.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/*