tar命令-跳过符号链接


13

我用tar命令,

tar -cvf protTests.tar protTests/*

tar该文件夹内的所有文件,protTests。但这包括文件夹内的符号链接,这不是所需的链接。

是否有一个命令行选项,将忽略所有符号链接?

Answers:


11

您可以这样做,以提供除符号链接tar文件protTests之外的所有文件的列表:

find protTests -maxdepth 1 -mindepth 1 -not -type l -print0 |
  tar --null --files-from - -cvf protTests.tar

顺便说一句,您现有的命令:

tar -cvf protTests.tar protTests/*

将不会归档中的所有文件protTests,只会归档名称不以.(不隐藏)开头的文件。该*水珠运营商跳过的文件,其名称开头.的设计。该命令还具有以下问题:如果protTests文件很多(超过数千个),则protTests/*可以扩展到太多参数而无法容纳在命令行中。

像这样的简单命令不会有这些问题:

tar -cvf protTests.tar protTests

1
Tar没有选项--files-from,这是gtar的选项,因此您提供这样的建议,更好的是,这是gtar特定的。Find没有primary -not,这是另一个不可移植的GNUism。通常,使用单独的find调用是一个坏主意。这可能会给文件名中的有趣字符带来问题,并且由于find和tar都需要扫描文件系统,因此肯定会降低性能。这些问题不适用于像star这样使用libfind并因此合并了查找代码的程序。
schily's

让我添加另一个一般性提示:当提供针对UNIX程序的特定于供应商的变体的建议时,最好提及该供应商并且它是特定于供应商的。通常可以通过使用软件的正式名称来完成此操作,例如,用gtar代替tar,用vim代替vi。请注意,这是一个与UNIX相关的信息平台,因此在一般示例中,应与POSIX标准保持一致。
schily's

没错,@ schily,这是特定于GNU的解决方案。您基于的答案star是一个很好的选择,因此,我对此表示反对。我也同意“有趣的字符”的反对意见,但是由于GNU tar没有-0选择权,所以这是一个折衷方案。我同意性能异议,在这种情况下,这实际上没有任何影响。
Celada's

2
@schily,既GNU tarbsdtar具有--files-from--null其去除滑稽字符问题(如果与组合find-print0-exec printf '%s\0' {} +)。但是在这里,您可能想要添加该--no-recursion选项。一些pax实现也有一个-0选项。
斯特凡Chazelas

2
@schily我认为此注释线程不是倡导使用的不同版本的地方tar。请带它聊天。已经太久了,阅读就像一场宗教战争。除非此时OP发出提示音,否则我认为所使用的版本不重要tar。我们甚至不知道他们使用的是哪种Unix。
Celada's

-2

我的tar实现是最好的方法

star -cv -f out.tar -find protTests ! -type l

8
zsh: command not found: star当您提到知道实用程序超过99%的读者不会在您的系统上使用的实用程序时,请说明从何处获取它们。并且,当您提及自己的产品时(无论是否发布链接,都必须公开您的隶属关系,因此您最好发布链接)。
吉尔(Gilles)“所以

如今,典型的Linux系统在默认安装后会丢失许多重要的软件,同时会安装许多无用的软件。Linux用户应该知道如何安装缺少的软件,而经常使用tar的人通常无论如何都安装了star。
schily's

8
绝大多数经常使用tar的人从未听说过pax,更不用说星星了。
吉尔(Gilles)'所以别再邪恶了'

那些不知道在称呼“ tar”时正在Linux上使用gtar的人可能根本不是在乎的人。Star是最古老的免费tar实现,而从tar实现中看到的许多功能都来自star,那么为什么不谈论原始内容呢?
schily's
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.