Gzip 文件,但不包括某些目录|文件并附加当前日期

Gzip 文件,但不包括某些目录|文件并附加当前日期

我正在寻找一种.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 脚本而不是命令行运行

更新:在脚本内测试

下列的@阿里尔建议我将此行添加到 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/,为什么?

答案1

只是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

答案2

gnu tar你可以使用:

--transform=EXPRESSION, --xform=EXPRESSION
      Use sed replace EXPRESSION to transform file names.

这意味着将从路径中--xform='s|path/to/||'删除; 和path/to/

--exclude=PATTERN
      Exclude files matching PATTERN, a glob(3)-style wildcard pattern.

所以你可以运行:

tar -zcvf /path/to/compressed/"$(date +%d-%m-%Y-%T)"-testdir.tar.gz \
--transform='s|^path/to/||' /path/to/compress \
--exclude='cache' --exclude='logs' --exclude='bootstrap.php.cache'

/请注意,与 一起使用的表达式中没有前导xform。更通用的方法:

--xform='s|^([^/]*/){2}||x'

这将删除路径的前两个元素(根据需要将 2 替换为另一个数字)。

相关内容