旧式语法下(GNU)tar 参数的顺序?

旧式语法下(GNU)tar 参数的顺序?

在 shell 管道中,我从目录下选择的文件组成 tar 存档,从 stdin 获取文件列表,并将存档写入 stdout。当我tar这样跑步时:

tar cCTf directory - -

一切安好。但是当我尝试像这样运行它时:

tar cTCf - directory -

tar找不到这些文件,并且我收到以下错误消息:

tar: The following options were used after any non-optional
arguments in archive create or update mode.  These options
are positional and affect only arguments that follow them.
Please, rearrange them properly.
tar: -C ‘directory' has no effect

第二条命令有什么问题?

我正在运行 GNU tar 1.34。

答案1

这个错误...

tar:在存档创建或更新模式下的任何非可选参数之后使用以下选项。这些选项是位置性的,仅影响其后的参数。请正确地重新排列它们。

tar:-C“目录”无效

...告诉您该C选项与位置相关。它只影响出现的选项它。所以当你用after写cTCf,时,它实际上是一个空操作。它不会影响 tar 解释 读取的文件名的方式,并且后面没有任何内容可以应用。-C-T-T

当您认为命令行上可以有多个选项时,这可能更容易理解,-T例如:-C

tar cCTCTf /path/to/dir1 filelist1 /path/to/dir2 filelist2 -

每个-C参数影响后面的-T参数(但不影响前面的任何参数)。

答案2

如果您不喜欢 GNU tar,bsdtar请使用您想要的语法执行您想要的操作:

$ find . -ls
 13107306    4 drwx--x---   3 user   grp       4096 Aug 30 12:54 .
 13107938    4 drwx--x---   2 user   grp       4096 Aug 30 12:38 ./directory
 13111189    4 -rw-------   1 user   grp         29 Aug 30 12:37 ./directory/a
 13113837    4 -rw-------   1 user   grp         29 Aug 30 12:37 ./directory/b
 13114062    4 -rw-------   1 user   grp         29 Aug 30 12:37 ./directory/c
$ printf "%s\n" a b c | bsdtar cTCf - directory - > output.tar
$ tar tvf output.tar 
-rw------- user/grp        29 2022-08-30 12:37 a
-rw------- user/grp        29 2022-08-30 12:37 b
-rw------- user/grp        29 2022-08-30 12:37 c

相关内容