仅 tar 文件,无目录

仅 tar 文件,无目录

我可能可以编写一个 shell 脚本来仅查找文件,然后将列表传递给 tar,但我想知道 tar 中是否已经有一个内置功能允许在单个命令行中执行此操作?

例如,我找到了--no-recursion开关,但是当我这样做时:

tar --no-recursion -cvf mydir.tar mydir

它只归档目录中条目的名称(包括子目录!),但不归档任何文件。

我也尝试过:

 tar --no-recursion -cvf mydir.tar mydir/*

但是,虽然它仅存档文件,但它也存档名字的子目录。

有没有办法只告诉 tar 文件,而不告诉目录?

答案1

当你想使用findwith时tar,最好的方法是使用cpionot tarcpio可以编写 tar 存档,旨在从标准输入获取要存档的文件列表。

find mydir -maxdepth 1 -type f -print0 | cpio -o -H ustar -0 > mydir.tar

使用findandcpio是一种更 unix 风格的方法,因为您可以利用find它拥有的所有功能来选择文件,并进行cpio归档。学习这个简单的用法是值得的cpio,因为您会发现它很容易解决您在尝试时遇到的问题tar

答案2

正如 camh 指出的那样,前面的命令有一个小问题,即给出太多文件名,它会执行多次,而后面的调用会默默地清除以前的运行。由于我们也不压缩,因此我们可以追加而不是覆盖:

find mydir -maxdepth 1 -type f -print0 | xargs -0 tar Avf mydir.tar
find mydir -maxdepth 1 -type f -exec tar Avf mydir.tar {} +

约克纳兹的回答使用tar's--null-Toptions 也有效。如果您已经cpio安装,卡姆的回答使用它也很好。如果你有zsh并且不介意使用它作为命令,吉尔斯的回答 使用 zsh glob ( *(.)) 似乎是最简单的。


关键是-maxdepth选择。最终答案,适当处理空格:

find mydir -maxdepth 1 -type f -print0 | xargs -0 tar cvf mydir.tar

这也应该有效:

find mydir -maxdepth 1 -type f -exec tar cvf mydir.tar {} +

答案3

您甚至可以根本不使用而直接使用find ... -print0and 。tar ... --nullxargs

find . -maxdepth 1 -type f -print0 | tar cvf mydir.tar --null -T -

在给定的示例中,--no-recursion选项 totar不是必需的,因为只有文件路径(而不是目录)将从findto传递tar

但是,在以下示例中使用--no-recursion选项可以防止双重归档目录。将执行目录树递归而不是then 。tartarfindtar

# compare
find . -print0 | tar cf mydir.tar --null -T -
tar -tf mydir.tar | nl

find . -print0 | tar cf mydir.tar --null --no-recursion -T -
tar -tf mydir.tar | nl

答案4

我不确定我是否理解您的要求。如果您想将常规文件存储在mydir而不是其子目录中,最简单的方法是使用 zsh,其中仅匹配常规文件只需使用. 全局限定符:

tar cf mydir.tar mydir/*(.)

相关内容