我的目录结构如下:
main_directory/
directory1:
sub_directory1:
files:
myfile.txt
otherfile.txt
sub_directory2:
files:
myfile.txt
otherfile.txt
sub_directory3:
files:
myfile.txt
otherfile.txt
sub_directory4:
files:
myfile.txt
otherfile.txt
directory2:
sub_directory1:
files:
myfile.txt
otherfile.txt
sub_directory2:
files:
myfile.txt
otherfile.txt
sub_directory3:
files:
myfile.txt
otherfile.txt
sub_directory4:
files:
myfile.txt
otherfile.txt
我试图找出(通过反复试验,因为我不是Linux上的专家)如何只在所有目录中gzip myfile.txt
文件。由于它们在不同的路径中都具有相同的文件名(没有办法解决这个问题),我需要能够将文件路径保存在存档中。所以我想要创建的最终gzipped tar文件将包含以下内容:
mytar.tar.gz
main_directory/directory1/sub_directory1/files/myfile.txt
main_directory/directory1/sub_directory2/files/myfile.txt
main_directory/directory1/sub_directory3/files/myfile.txt
main_directory/directory1/sub_directory4/files/myfile.txt
main_directory/directory2/sub_directory1/files/myfile.txt
main_directory/directory3/sub_directory2/files/myfile.txt
main_directory/directory4/sub_directory3/files/myfile.txt
main_directory/directory5/sub_directory4/files/myfile.txt
是否有一种简单的bash
方法可以做到这一点?我想我可以写一个python
脚本来做这件事,但这似乎有点过头了。
有人有任何建议吗?
答案 0 :(得分:4)
这克服了另一个答案中描述的这个问题。
find main_directory/ -name "myfile.txt" | tar -czvf mytar.tar.gz -T -
答案 1 :(得分:2)
假设文件不是太多,您可以执行以下操作:
cd main_directory/..
find main_directory -name "myfile.txt" | xargs tar zcf mytar.tar.gz
如果有大量文件,您可以将文件列表传输到文件/流中并将其传递给tar。
find main_directory -name "myfile.txt" -print0 | tar zcf myar.tar.gz --null -T -
这会打印出以空值(-print0
到find
)分隔的文件名,并指示tar
从stdin
正确解析该文件名;使用空值可确保正确处理目录中的任何特殊字符
答案 2 :(得分:0)
使用足够新的(4.0.0+我相信)版本的bash(以及许多其他shell),以下内容将起作用:
tar -czf mytar.tar.gz main_directory/**/myfile.txt
答案 3 :(得分:0)
如果目录结构确实是常规的,那么通配符
main_directory/*/*/files/myfile.txt
将匹配您想要的文件。但是,如果文件很多,您可能需要恢复为find
/ xargs
,以避免"参数列表太长" (ARG_MAX
)问题。
如果有一些名为myfile.txt
的文件由于其路径与通配符不完全匹配而不想包含,那么肯定有办法将它们从find
中排除;或许这个额外的约束应该在问题中说明。