find grep exec,结果

find grep exec,结果

如果我运行以下命令

find ./dir -type f -newermt 2017-04-01 ! -newermt 2018-06-30 -printf "%TY/%Tm/%Td  %TH:%TM:%.2TS   %p\n" -exec grep -E -l "pattern" {} \; | sort -n;

将返回:

./dir_2/01.py</br>
./dir_2/03.py</br>
./dir_2/05.py</br>
2018/05/08  08:44:55   ./dir_2/01.py</br>
2018/05/08  08:45:03   ./dir_2/02.py</br>
2018/05/08  08:45:13   ./dir_2/03.py</br>
2018/05/08  08:45:21   ./dir_2/04.py</br>
2018/05/08  08:45:28   ./dir_2/05.py</br>

但我想要这个:(因为只有这三个文件包含“模式”)(包括日期和时间戳)

2018/05/08  08:44:55   ./dir_2/01.py</br>
2018/05/08  08:45:13   ./dir_2/03.py</br>
2018/05/08  08:45:28   ./dir_2/05.py</br>

我使用的 Ubuntu 版本:14.04.5 LTS trusty 和 find 版本(GNU findutils)4.4.2。

答案1

将 放在-exec grep [...]之前-printf并将 发送stdoutgrep/dev/null需要sh -c)效果很好:

find ./dir -type f -newermt 2017-04-01 ! -newermt 2018-06-30 \
  -exec sh -c 'grep -E -l "pattern" "{}" 1>/dev/null' \; \
  -printf "%TY/%Tm/%Td  %TH:%TM:%.2TS   %p\0" | \
sort -z -n | tr '\0' '\n'

感谢您的提问,我学到了一些新东西。我甚至不知道可以find这样过滤结果。

另一个选择是使用一些管道和xargs。第一次性能测试表明这甚至更快一点,尽管我不知道为什么:

find ./dir -type f -newermt 2017-04-01 ! -newermt 2018-06-30 -print0 | \
  xargs -0 -i -P6 grep -E -l "pattern" "{}" | \
  xargs -i find "{}" -printf "%TY/%Tm/%Td  %TH:%TM:%.2TS   %p\0" | \
sort -z -n | tr '\0' '\n'

(注意-P6--> 并行运行grep命令。)

相关内容