我正在执行 tar 命令来压缩另一个目录中存在的文件。
我执行了以下命令:
tar -czf /backupmnt/abc.tar.gz -C /backupmnt/statusService/ *
我想创建 abc.tar.gz 文件,其中/backupmnt
应包含/backupmnt/statusService/
目录中的所有文件,但出现以下错误:
tar: components: Cannot stat: No such file or directory
tar: Exiting with failure status due to previous errors
components
存在于我执行命令的当前目录中。以下是内容/backupmnt/statusService
SS-01:/ # ls /backupmnt/statusService
MJ.netact.xml.tar.gz gmoTemp_fm.tar.gz mr.properties.tar.gz probe.properties.tar.gz relay_logs.tar.gz ss_logs.tar.gz tomcat_conf.tar.gz
esymac_config.txt.tar.gz gmoTemp_pm.tar.gz o2ml.tar.gz probes_logs.tar.gz ss_conf.tar.gz ss_pm.tar.gz tomcat_logs.tar.gz
我不明白我错在哪里。
答案1
*
tar
在执行之前由 shell 展开。因此,tar
更改目录会使*
扩展为的参数无效。您可以简单地告诉tar
压缩目录:
tar -czf /backupmnt/abc.tar.gz -C /backupmnt/statusService/ .
代表.
当前目录,当tar
目录改变时,它也会改变。这将导致隐藏文件(以 开头的文件.
)被包含在存档中。
答案2
为什么不使用显式目录更改?
cd /backupmnt/statusService && tar -czf /backupmnt/abc.tar.gz *
或者您可以使用相对路径:
cd /
tar -czf /backupmnt/abc.tar.gz backupmnt/statusService1/* backupmnt/statusService2/* backupmnt/statusService3/*
这可能是更好的解决方案,因为您可以将文件分隔在文件夹中并避免覆盖重复的文件名
答案3
-C
无论如何都不是一个便携式选项。这是一个 GNU 选项,而不是 UNIX 选项。
tar
无论如何,单一 UNIX 规范不再指定,因为实现之间存在很大差异。它必须pax
可移植地创建档案。
你可以这样做:
pax -ws '|.*//||' /backupmnt/statusService//. /some/other/dir//./*.ext |
xz > file.tar.xz
(POSIX 未指定xz
/ )。gzip
这是用来//.
标记路径的哪一部分要被剥离。