压缩与模式匹配的所有子文件夹中的所有文件

Compress all files in all subfolders matching a pattern

提问人:Simon 提问时间:10/27/2023 更新时间:10/27/2023 访问量:54

问:

在我的根文件夹中,有许多名为 、 、 、 ... 它们中的每一个都有不同的子文件夹层次结构。 在我的情况下,我需要压缩与模式匹配的所有子文件夹中的文件(所有名称中带有“test”的 numpy 文件)。data_xdata_easydata_real*test*.npy

目前,我有

shopt -s globstar; tar -czvf data.tar.gz data*/**/*test*.npy

但它非常慢。有时,只压缩所有文件而不将模式与 匹配会更快。有没有更有效的方法可以做到这一点?**/*test*.npy

bash shell unix tar

评论

1赞 Barmar 10/27/2023
是压缩问题还是列出所有文件?有多快?echo data*/**/*test*.npy > /dev/null
0赞 Simon 10/27/2023
清单。你的命令也很慢。菲利普建议的解决方案是有效的,所以我想这很慢,不知道为什么。**
1赞 Charles Duffy 10/27/2023
**,与 不同,对输出进行排序;而且,由于您要将 glob 放在 argv 上,因此在启动 tar 之前必须完全知道 argv。该操作可以在找到结果后立即开始写入结果;glob 必须先完成对所有文件名的查找,然后才能对它们进行排序,然后才能调用 .findfindtar
0赞 Simon 10/27/2023
@CharlesDuffy 完美,谢谢你的信息!
1赞 Charles Duffy 10/27/2023
(Philippe 的回答也很好,因为它可以处理比命令行更长的文件名列表——所以性能并不是使用这种方法的唯一原因)

答:

2赞 Philippe 10/27/2023 #1

试试这个,看看是否有性能改进:

find data* -type f -name "*test*.npy" -print0 | tar -czvf data.tar.gz --null -T -

评论

0赞 Simon 10/27/2023
快多了,谢谢!你能解释一下为什么这么慢吗?**
1赞 Barmar 10/27/2023
@Simon shell 对文件名进行排序。如果有很多,这可能会很慢。
1赞 Charles Duffy 10/27/2023
不仅如此,在管道中,当开始操作时,它仍然可以运行,但对于 glob,这两个步骤是串行的。findtar
0赞 Simon 10/27/2023
明白了,非常感谢您的解释!