我正在寻找一种.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 替换为另一个数字)。