Bash - 如何在子目录中存档和压缩文件,但只能使用特定的文件名

时间:2014-08-24 03:32:41

标签: linux bash gzip tar

我的目录结构如下:

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脚本来做这件事,但这似乎有点过头了。

有人有任何建议吗?

4 个答案:

答案 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 -

这会打印出以空值(-print0find)分隔的文件名,并指示tarstdin正确解析该文件名;使用空值可确保正确处理目录中的任何特殊字符

答案 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中排除;或许这个额外的约束应该在问题中说明。