我可能可以编写一个 shell 脚本来仅查找文件,然后将列表传递给 tar,但我想知道 tar 中是否已经有一个内置功能允许在单个命令行中执行此操作?
例如,我找到了--no-recursion
开关,但是当我这样做时:
tar --no-recursion -cvf mydir.tar mydir
它只归档目录中条目的名称(包括子目录!),但不归档任何文件。
我也尝试过:
tar --no-recursion -cvf mydir.tar mydir/*
但是,虽然它仅存档文件,但它也存档名字的子目录。
有没有办法只告诉 tar 文件,而不告诉目录?
答案1
当你想使用find
with时tar
,最好的方法是使用cpio
not tar
。cpio
可以编写 tar 存档,旨在从标准输入获取要存档的文件列表。
find mydir -maxdepth 1 -type f -print0 | cpio -o -H ustar -0 > mydir.tar
使用find
andcpio
是一种更 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
和-T
options 也有效。如果您已经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 ... -print0
and 。tar ... --null
xargs
find . -maxdepth 1 -type f -print0 | tar cvf mydir.tar --null -T -
在给定的示例中,--no-recursion
选项 totar
不是必需的,因为只有文件路径(而不是目录)将从find
to传递tar
。
但是,在以下示例中使用--no-recursion
选项可以防止双重归档目录。将执行目录树递归而不是then 。tar
tar
find
tar
# 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/*(.)