我希望将目录及其子目录中所有不以 .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
两种方法都是正确的,但我的更易读、更紧凑:)