Bash

Gzip 文件,但不包括一些目錄|文件,還附加目前日期

  • March 2, 2015

我正在尋找一種.tar.gz從目錄創建文件的方法,但我有一些疑問。我知道創建文件的命令是:

tar -zcvf /path/to/compressed/file.tar.gz /path/to/compress 

然後我會得到一個file.tar.gz,但這會保留原始來源的路徑。所以這就是我要找的:

  • 應該壓縮為.tar.gz
  • 如果有可能不應該保留壓縮目錄的路徑,我的意思是我只需要壓縮目錄及其內容。例如,如果我在 Windows 下解壓縮文件,我會得到/path[folder]/to[folder]/compress[folder+content]並且我只想要最新的
  • 如果可能的話,我可以省略一些目錄嗎?範例我喜歡壓縮app/文件夾,其內容是:
drwxrwxr-x  6 ubuntu ubuntu  4096 Feb 24 14:48 ./
drwxr-xr-x 10 ubuntu ubuntu  4096 Feb 26 22:33 ../
-rw-rw-r--  1 ubuntu ubuntu   141 Jan 29 06:07 AppCache.php
-rw-rw-r--  1 ubuntu ubuntu  2040 Feb 24 14:48 AppKernel.php
-rw-rw-r--  1 ubuntu ubuntu   267 Jan 29 06:07 autoload.php
-rw-r--r--  1 root   root   94101 Feb 19 21:09 bootstrap.php.cache
drwxrwxrwx  4 ubuntu ubuntu  4096 Feb 25 16:44 cache/
-rw-rw-r--  1 ubuntu ubuntu  3958 Feb 24 14:48 check.php
drwxrwxr-x  2 ubuntu ubuntu  4096 Feb 24 14:48 config/
-rwxrwxr-x  1 ubuntu ubuntu   867 Jan 29 06:07 console*
-rw-rw-r--  1 ubuntu ubuntu  6148 Jan 29 06:07 .DS_Store
-rw-rw-r--  1 ubuntu ubuntu   143 Jan 29 06:07 .htaccess
drwxrwxrwx  2 ubuntu ubuntu  4096 Feb 24 14:48 logs/
-rw-rw-r--  1 ubuntu ubuntu  1118 Jan 29 06:07 phpunit.xml.dist
drwxrwxr-x  5 ubuntu ubuntu  4096 Jan 29 06:07 Resources/
-rw-rw-r--  1 ubuntu ubuntu 30404 Feb 24 14:48 SymfonyRequirements.php

但是我想省略目錄和文件cache/,如何?那可能嗎?logs/``bootstrap.php.cache

  • 我需要將目前日期(DD/MM/YYYY-H:M:S)附加到文件名,如何?

我能得到一些建議或幫助嗎?我打算將它添加到 Bash 腳本中,這樣它就可以作為 bash 腳本而不是命令行

更新:在腳本內進行測試

根據**@Ariel 的**建議,我已將此行添加到 bash 腳本中:

read -e -p "Enter the directory to compress: " -i "/var/www/html/" directory
read -e -p "Enter the filename: " filename
FILENAME = "$filename-`date +%d-%m-%Y-%X`.tgz"

cd "$directory"
tar -zcvf /home/$FILENAME --exclude cache --exclude logs --exclude bootstrap.php.cache --exclude composer.lock --exclude vendor

但我收到了這個錯誤:

Enter the directory to compress: /var/www/html/lynxoft/apps/checkengine/
Enter the filename: checkengine
/usr/local/bin/script-task: line 109: FILENAME: command not found
tar: Cowardly refusing to create an empty archive

為什麼像文件FILENAME所說的那樣被視為命令而不是 var ?

更新 2:仍在壓縮整個路徑

由於使用者的評論和腳本上的行看起來像這樣,我已經解決了一些問題:

read -e -p "Enter the directory to compress: " -i "/var/www/html/" directory
read -e -p "Enter the filename: " filename
FILENAME="$filename"-$(date +%d-%m-%Y-%T).tgz

cd "$directory/.."
tar -zcvf /home/$FILENAME "$directory" --exclude="*cache*" --exclude=logs --exclude=bootstrap.php.cache --exclude=composer.lock --exclude=vendor --exclude=.git

唯一剩下的問題是壓縮文件仍然具有整個路徑,而不僅僅是結束目錄。例如:

Enter the directory to compress: /var/www/html/lynxoft/apps/checkengine/
Enter the filename: file

這導致file-28-02-2015-17:44:32.tgz壓縮文件中的內容仍然具有整個路徑/var/www/html/lynxoft/apps/checkengine/,為什麼?

只需cd到您希望 tarball 樹結構開始的文件夾,並使用相對路徑!例如:

# Note, one folder above
cd /path/to/compress/..
# Tell tar to compress the relative path    
tar -zcvf /path/to/compressed/file.tar.gz compress

當您解壓縮它時,它將 compress在目前工作目錄中創建該文件夾。

您可以使用該選項排除文件或文件夾--exclude <PATTERN>,並在文件名中添加日期date +FORMAT,例如:

FILENAME="file-`date +%d-%m-%Y-%T`.tgz"
tar -zcvf /path/to/compressed/$FILENAME --exclude cache --exclude logs --exclude bootstrap.php.cache compress

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