TAR 不喜欢哪些字符?

vim*_*ude 2 tar special-characters escape-characters

我保留了一张刻录到 dvd 的照片列表以进行增量备份,但我遇到了一个奇怪的情况,文件已经刻录到 dvd 中,但 tar 一直说不是。这里重现的步骤:

mkdir tarbug && cd tarbug
mkdir -p photos/{1,2,3}
touch "photos/1/P06-23-08_15.21[1].jpg"
touch "photos/2/P06.jpg"
touch "photos/3/P01.jpg"
Run Code Online (Sandbox Code Playgroud)

创建所有文件的列表(通常我会在刻录 DVD 后附加到列表中):

find photos -type f > list
Run Code Online (Sandbox Code Playgroud)

现在给我新文件,不包括列表中的文件并且不显示目录:

tar cf - photos -X list | tar tf - | grep -v '/$'
Run Code Online (Sandbox Code Playgroud)

结果:

photos/1/P06-23-08_15.21[1].jpg
Run Code Online (Sandbox Code Playgroud)

这不应该显示在文件列表中。我发现它的括号需要用反斜杠转义?但我怎么知道呢?tar 不喜欢或用于其他用途的任何字符列表?

der*_*ert 7

如果您查看tar的联机帮助页,您会看到:

 -X, --exclude-from FILE
       exclude patterns listed in FILE
Run Code Online (Sandbox Code Playgroud)

信息文档提供了更多详细信息。

所以list需要是一个模式列表,而不是文件名。甲图案,为正常,是指壳通配符模式。因此,至少,*, [] 和]是特殊的。可能{}也可能。

该文档还提到您可以通过传递--no-wildcards. 然后名称将按字面匹配,而不是作为模式匹配。--no-wildcards需要去之前-X

[这是我检查过的 GNU tar。其他 tar 实现可能有所不同。]