如果我运行以下命令
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
并将 发送stdout
给grep
(/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
命令。)