tar - 排除某些文件

Ala*_*lan 5 grep tar find exclude

我希望对目录及其子目录中的所有文件进行 tar 压缩,这些文件不以 .jpg、.bmp、.gif 或 png 结尾。

因此,给定以下文件夹和文件:

foo/file.txt
foo/file.gif
foo/bar/file
foo/bar/image.jpg
Run Code Online (Sandbox Code Playgroud)

我只想压缩文件file.txtfile。file.gif 和 image.jpg 应该被忽略。我还想维护文件夹结构。

我的第一个想法是将 find 命令的结果与 grep -v ".jpg|.gif|.bmp.png" 一起通过管道传输到文本文件,然后使用 tar 包含参数将文件列表提供给它。

但是,grepped find 命令的结果也包含目录(在上面的示例中,它将是“foo”和“foo/bar”),并且当一个目录被提供给 tar 时,它包括该目录中的所有文件,所以我最终会得到一个包含所有文件的 tar 文件——这不是我想要的。

有什么办法可以防止 find 输出目录吗?有没有更简单的方法来解决这个问题?

小智 14

使用--exclude=pattern选项:

tar --exclude='*.jpg' --exclude='*.png' --exclude='*.bmp' --exclude='*.gif' -cvf tar-filename.tar folder
Run Code Online (Sandbox Code Playgroud)


小智 5

我认为删除多个文件类型的最优雅的方法是使用所谓的大括号扩展

支撑扩展如何工作?

大括号扩展允许您根据大括号内的模式创建多个字符串,其中每个模式用逗号分隔。例如,命令

echo Front-{A,B,C}-Back
Run Code Online (Sandbox Code Playgroud)

将产生

Front-A-Back Front-B-Back Front-C-Back
Run Code Online (Sandbox Code Playgroud)

就这么简单:) 您还可以使用以下表示法扩展整数范围

echo {001..15}
Run Code Online (Sandbox Code Playgroud)

如何使用大括号扩展来解决您的问题?

尝试一下:

tar --exclude={'*.jpg','*.png','*.bmp','*.gif'} -cvf tar-filename.tar folder
Run Code Online (Sandbox Code Playgroud)

如果您想查看发生了什么,只需回显最后一个命令,您会注意到它会产生

tar --exclude=*.jpg --exclude=*.png --exclude=*.bmp --exclude=*.gif -cvf tar-filename.tar folder
Run Code Online (Sandbox Code Playgroud)

两种方法都是正确的,但我的方法更具可读性和紧凑性:)

  • 这是对现有答案的一个非常好的补充。 (2认同)