我有一个像这样的文件夹结构:
/foo
/foo/bar
/foo/bar2
/foo/bar3
在每个文件夹(包括/foo
)中,我都有名称结尾的文件.txt
。但是,我想排除这些文件/foo
,并包含 /foo/bar /foo/bar2 等中的文件。
但是,如果我这样做:
tar cvfz foo.tgz --exclude="/foo/*.txt" /foo
我错过了.txt
完整层次结构中的所有文件,而不仅仅是/foo
.
有人知道如何实现这一目标吗?
答案1
不确定是否可以只使用 tar 来做到这一点,因为--exclude
似乎只接受 glob 样式的模式。但是您可以使用 find 获取文件列表,然后使用正则表达式使用 grep 过滤这些文件。
find foo -type f -print0 | grep -z -v '^foo/[^/]*.txt$' | tar cvf foo.tgz --null -T -
选项-print0
、-z
和--null
指示相应的命令使用空字节而不是换行符来分隔记录(文件名)。这是一个很好的做法,因为某些文件可能包含意外字符。