【发布时间】:2015-06-15 15:46:09
【问题描述】:
我在同一组文件上多次运行 find 命令。我的 find 命令的结果通常是不相交的集合,AKA 我正在运行 find -mmin +35; find -mmin -25,对结果做不同的处理。
在一次搜索时多次搜索整个文件系统似乎有点愚蠢。有没有办法将多个“搜索参数”放入单个查找命令中,并根据它满足的参数将输出通过管道传输到不同的位置?
谢谢
【问题讨论】:
标签: linux bash shell unix find
我在同一组文件上多次运行 find 命令。我的 find 命令的结果通常是不相交的集合,AKA 我正在运行 find -mmin +35; find -mmin -25,对结果做不同的处理。
在一次搜索时多次搜索整个文件系统似乎有点愚蠢。有没有办法将多个“搜索参数”放入单个查找命令中,并根据它满足的参数将输出通过管道传输到不同的位置?
谢谢
【问题讨论】:
标签: linux bash shell unix find
试试这个:
find . -mmin +35 -or -mmin -25
find 支持多个逻辑运算符(-and、-or、-not)。有关更多详细信息,请参见手册页的 OPERATORS 部分。
===================== 编辑:针对有关以不同方式处理两个匹配项的问题,我不知道直接使用 find 执行此操作的方法。就我个人而言,我会做的是像这样在 for 循环中处理输出(注意这是伪代码):
for f in `find . [condition 1] -or [condition 2]` ;do
if [ f meets condition1 ]; then
doSomething
elif [ f meets condition2 ]; then
doSomethingElse
fi
done
我敢肯定,有很多 bash 大师可以更清洁、更高效地完成这项工作。
【讨论】:
您可以使用tee 将输出复制到两个不同的子shell 并进行不同的处理。
find . -mmin +35 -or -mmin -25 | tee \
>(while read f; do if [ $f meets condition1 ]; then; doSomething; done) \
>(while read f; do if [ $f meets condition2 ]; then; doSomethingElse; done) \
>/dev/null
这是我阅读 EJK 的答案后想到的第一个解决方案。
编辑:这是未经测试的。显示原理的工作示例如下:
echo -e "abc\ndef\nauv\nafg\ndtt" | tee >(grep -P '^a' > a.txt) >(grep -P '^d' > d.txt) >/dev/null
【讨论】: