Answers:
找 。-type f -name“ * .htm *” -o -name“ * .js *” -o -name“ * .txt”
的缩写:
找 。\(\(型的F -a -name “的* .htm *” \)-o \ \(-name “* .js文件*” \)-o \ \(- name“ * .txt” \)\ \) -打印
也就是说,由于未指定任何动作谓词(仅指定condition),因此-print
将为符合条件的文件隐式添加一个动作。
(顺便说一下,这将打印非常规.js
文件(-type f
仅适用于.htm
文件))。
而:
找 。-type f -name“ * .htm *” -o -name“ * .js *” -o -name“ * .txt” \ -exec sh -c'echo“ $ 0”'{} \;
的缩写:
找 。\(型的F -a -name “的* .htm *” \)-o \ \(-name “* .js文件*” \)-o \ \(- name“ * .txt” -a -exec sh -c'echo“ $ 0”'{} \; \)
对于find
(就像在许多语言中一样),AND(-a
;;省略时隐式)的优先级高于OR(-o
),并且添加显式动作谓词(此处-exec
)会取消-print
上面看到的隐式动作。在这里,您想要:
find . -type f \( -name "*.htm*" -o -name "*.js*" -o -name "*.txt" \) \
-exec sh -c 'echo "$0"' {} \;
要么:
find . -type f \( -name "*.htm*" -o -name "*.js*" -o -name "*.txt" \) -exec sh -c '
for i do
echo "$i"
done' sh {} +
为了避免sh
每个文件运行一个。
它是暗含的括号。添加明确的括号。\(
\)
find . -type f \( -name "*.htm*" -o -name "*.js*" -o -name "*.txt" \) -exec sh -c 'echo "$0"' {} \;
或使用xargs(我喜欢xargs,我发现它更容易,但显然不那么可移植)。
find . -type f \( -name "*.htm*" -o -name "*.js*" -o -name "*.txt" \) -print0 | xargs -0 -n1 echo
*.js*
*.txt