Linux &引用;tar——目录";韩元';行不通

Linux &引用;tar——目录";韩元';行不通,linux,unix,tar,Linux,Unix,Tar,我想创建一个文件tarball,但不包括目录名。我知道还有另一种方法,但我想知道为什么这种方法不起作用 如果我运行以下命令来创建由特定文件组成的tarball,那么它可以工作: tar -vcf file.tar -C <PATH TO DIR> file1 tar-vcf file.tar-C file1 但是,如果我在通配符上运行它以包含多个文件,那么它将失败: tar -vcf file.tar -C <PATH TO DIR> * tar-vcf file.

我想创建一个文件tarball,但不包括目录名。我知道还有另一种方法,但我想知道为什么这种方法不起作用

如果我运行以下命令来创建由特定文件组成的tarball,那么它可以工作:

tar -vcf file.tar -C <PATH TO DIR> file1
tar-vcf file.tar-C file1
但是,如果我在通配符上运行它以包含多个文件,那么它将失败:

tar -vcf file.tar -C <PATH TO DIR> *
tar-vcf file.tar-C*
我得到一个错误,对于当前目录中的每个文件(不是-C中指定的目录),
tar::Cannot stat:没有这样的文件或目录


知道为什么在通配符上运行上述命令与在文件名上运行不同吗?

您必须使用目录:

tar -vcf files.tar /path/to/directory
如果文件在文件夹中,则使用
引用当前文件夹:

tar -vcf files.tar .

在调用
tar
之前,shell将扩展
*
通配符
tar
然后更改目录(因为您要求它这样做),但随后无法找到shell当前目录中的文件

当然,更改shell中的目录意味着您无法在原始当前目录中打开输出文件。因此,您必须将tar的输出重定向到子shell之外,如下所示:

(cd $DIR; tar -vc *) > file.tar

对于您来说,这是一个更好的问题,您可能希望添加一些引号,并使用
&
仅在
cd
成功时继续操作:
(cd“$dir”&&exec tar-vc*)
;这样,如果目录名包含空格,我们就不会崩溃,我们不会超出必要的范围,如果子目录不存在或我们没有cd进入的权限,我们也不会尝试对当前目录加焦油。@CharlesDuffy我觉得这是在命令行上,因此a)我更喜欢写
cd$DIR
而不是
cd
b)无论如何,你都有可能完成目录。这解决了第一个问题。另外两个问题(特别是,如果使用
而不是
&&
cd
命令失败,则会发出命令给当前目录加上焦油)。