在 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