包含这些文件的目录:
irrelevant irrelevant.doc dok1.txt dok2.text dok3.txt dok4.text
我需要找到所有 *txt 和 *text 文件并对它们进行一些转换。
find
命令和结果:
$ find -name '*txt' -or -name '*text'
./dok2.text
./dok4.text
./dok3.txt
./dok1.txt
这是我需要的理想结果,将这四个文件传递给-exec
.
不幸的是,find
使用-print
(或-exec echo {} +
) 会产生:
$ find -name '*txt' -or -name '*text' -print
./dok2.text
./dok4.text
显然这是 find 的情况(来自 find 手册页):
NON-BUGS
Operator precedence surprises
The command find . -name afile -o -name bfile -print will never print afile
because this is actually equivalent to find . -name afile -o \( -name bfile
-a -print \). Remember that the precedence of -a is higher than that of -o
and when there is no operator specified between tests, -a is assumed.
应如何给出 find 命令以使所有四个文件可供 -exec 使用?
答案1
您需要对 or-ed 表达式进行分组,以便它们作为一个组具有与后面的 and-ed 表达式相同的优先级:
find \( -name '*txt' -or -name '*text' \) -print