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.txt和file。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)
两种方法都是正确的,但我的方法更具可读性和紧凑性:)
| 归档时间: |
|
| 查看次数: |
10754 次 |
| 最近记录: |