tar—排除某些文件

tar—排除某些文件

我希望将目录及其子目录中所有不以 .jpg、.bmp、.gif 或 png 结尾的文件打包成 tar。

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

foo/file.txt
foo/file.gif
foo/bar/file
foo/bar/image.jpg

我只想 tar 文件文件.txt文件.file.gif 和 image.jpg 应该被忽略。我还想保留文件夹结构。

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

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

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

答案1

使用--exclude=pattern选项:

tar --exclude='*.jpg' --exclude='*.png' --exclude='*.bmp' --exclude='*.gif' -cvf tar-filename.tar folder

答案2

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

大括号扩展如何工作?

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

echo Front-{A,B,C}-Back

将产生

Front-A-Back Front-B-Back Front-C-Back

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

echo {001..15}

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

尝试一下:

tar --exclude={'*.jpg','*.png','*.bmp','*.gif'} -cvf tar-filename.tar folder

如果你想检查发生了什么,只需回显最后一条命令,你就会注意到它会产生

tar --exclude=*.jpg --exclude=*.png --exclude=*.bmp --exclude=*.gif -cvf tar-filename.tar folder

两种方法都是正确的,但我的更易读、更紧凑:)

相关内容