如何查找文件夹(包括子文件夹)中扩展名为 jpg 或 bmp、大小在 6 到 46 千字节之间、最后修改时间为 2011 年 6 月 11 日至 19 日之间或 7 月 24 日至 8 月 2 日之间的所有文件,并将所有这些文件添加到档案(bzip2)中?
答案1
您可以尝试类似的命令(但它实际上有一个缺陷):
$ find . \( -name "*.jpg" -o -name "*.bmp" \) -and \( -size +6k -and -size -46k \) -and \( \( -newermt "2011-06-11" -and ! -newermt "2011-06-19" \) -or \( -newermt "2011-07-24" -and ! -newermt "2011-08-02" \) \) -print0 | xargs -0 tar cjf out.tar.bz2 --files-from=-
但不确定日期。对我来说它很有用,YYYY-MM-DD
但它可能会随着语言设置而改变。
更新:
上面的例子存在一个重大的概念错误。
基本上,该xargs
命令以“遍历”的方式工作(例如,将尽可能多的文件名塞进命令行并调用该tar
命令)。所以out.tar.bz2
每次传递都会被重写。
几十个测试文件可能不会引起注意,但几百个测试文件肯定会触发该错误。因此需要将命令重写如下:
$ find . \( -name "*.jpg" -o -name "*.bmp" \) -and \( -size +6k -and -size -46k \) -and \( \( -newermt "2011-06-11" -and ! -newermt "2011-06-20" \) -or \( -newermt "2011-07-24" -and ! -newermt "2011-08-03" \) \) -print0 | tar cjf out.tar.bz2 --null --files-from=-
主要区别在于没有xargs
使用--null
选项tar
。此选项将告诉tar
读取空终止文件名(由find
命令-print0
选项生成)。这些以空字符结尾的文件名背后的全部原因是为了避免文件名包含特殊字符(例如空格),否则会破坏命令tar
。
另一个需要指出的可能的错误是日期范围规范。日期范围的上限应增加 1 天(否则当天修改的文件将被忽略)。