tìm thấy . -type f -name "* .htm *" -o -name "* .js *" -o -name "* .txt"
là viết tắt của:
tìm thấy . \ (\ ( -type f -a -name "* .htm *" \) -o \
\ ( -name "* .js *" \) -o \
\ ( -name "* .txt" \) \
\) -Một bản in
Đó là bởi vì không có biến vị ngữ hành động nào được chỉ định (chỉ điều kiện ), nên một -print
hành động được thêm vào cho các tệp khớp với các điều kiện.
(và, nhân tiện, điều đó sẽ in các .js
tệp không thường xuyên ( -type f
chỉ áp dụng cho .htm
các tệp)).
Trong khi:
tìm thấy . -type f -name "* .htm *" -o -name "* .js *" -o -name "* .txt" \
-exec sh -c 'echo "$ 0"' {} \;
là viết tắt của:
tìm thấy . \ ( -type f -a -name "* .htm *" \) -o \
\ ( -name "* .js *" \) -o \
\ ( -name "* .txt" -a -exec sh -c 'echo "$ 0"' {} \; \)
Vì find
(như trong nhiều ngôn ngữ), AND ( -a
; ẩn khi bị bỏ qua) được ưu tiên hơn OR ( -o
) và thêm một vị từ hành động rõ ràng (ở đây -exec
) hủy bỏ -print
hành động ngầm nhìn thấy ở trên. Ở đây, bạn muốn:
find . -type f \( -name "*.htm*" -o -name "*.js*" -o -name "*.txt" \) \
-exec sh -c 'echo "$0"' {} \;
Hoặc là:
find . -type f \( -name "*.htm*" -o -name "*.js*" -o -name "*.txt" \) -exec sh -c '
for i do
echo "$i"
done' sh {} +
Để tránh chạy một sh
tệp trên mỗi tệp.
*.js*
hoặc*.txt
.