Câu trả lời:
Đây là một lớp lót mà tôi tin là làm những gì bạn muốn:
find /tmp -name something | egrep '.*'
Trạng thái trả về sẽ là 0
khi một cái gì đó được tìm thấy, và khác không.
Nếu bạn cũng cần nắm bắt đầu ra find
để xử lý thêm, thì câu trả lời của Sven đã đề cập đến điều đó.
find ... | read
Giải pháp đơn giản nhất không in, nhưng thoát 0 khi tìm thấy kết quả
find /tmp -name something | grep -q "."
Thoát 0 dễ dàng với tìm kiếm, thoát> 0 khó hơn vì điều đó thường chỉ xảy ra với một lỗi. Tuy nhiên chúng ta có thể làm cho nó xảy ra:
if find -type f -exec false {} +
then
echo 'nothing found'
else
echo 'something found'
fi
find
dường như không phụ thuộc vào mã thoát của bất kỳ -exec
s nào nó chạy.
exec
phần, không dưới giá trị trả về). Nó không thể phân biệt giữa không tìm thấy gì và tự tìm ra lỗi (ví dụ: khi nó được gọi trên điểm bắt đầu không tồn tại).
Vừa tìm thấy câu hỏi này trong khi cố gắng tìm cách giải quyết vấn đề với Puppet (thay đổi quyền trên các thư mục trong một thư mục nhưng không phải trên chính thư mục đó), điều này có vẻ hoạt động:
! test -z $(find /tmp -name something)
Trường hợp sử dụng cụ thể của tôi là thế này:
! test -z $(find /home -mindepth 1 -maxdepth 1 -perm -711)
Sẽ thoát mã 1 nếu lệnh find không tìm thấy tệp nào có quyền yêu cầu.
Điều đó là không thể. Tìm trả về 0 nếu nó thoát thành công, ngay cả khi nó không tìm thấy tệp (đó là kết quả chính xác không chỉ ra lỗi khi tệp thực sự không tồn tại).
Để báo giá tìm trang
TÌNH TRẠNG EXIT
tìm lối thoát với trạng thái 0 nếu tất cả các tệp được xử lý thành công, lớn hơn 0 nếu xảy ra lỗi. Đây cố tình là một mô tả rất rộng, nhưng nếu giá trị trả về là khác không, bạn không nên dựa vào tính chính xác của kết quả tìm kiếm.
Tùy thuộc vào những gì bạn muốn đạt được, bạn có thể thử tìm -print
tên tệp và kiểm tra đầu ra của nó:
#!/bin/bash
MYVAR=`find . -name "something" -print`
if [ -z "$MYVAR" ]; then
echo "Notfound"
else
echo $MYVAR
fi
exec
/ execdir
tùy chọn (được sử dụng với +
):If any invocation returns a non-zero value as exit status, then find returns a non-zero exit status.
Tôi cảm thấy rằng đây là phương pháp ngắn gọn và trực tiếp nhất:
test `find /tmp/ -name something -print -quit 2>/dev/null`
-print -quit
, điều này có thể giải quyết mối quan tâm của bạn.
Đây là một kịch bản nhỏ mà tôi đã gọi test.py
. Nó cải thiện các phương thức khác được đăng ở chỗ nó sẽ trả về mã lỗi nếu một phương thức được đặt và nó cũng đặt một phương thức nếu tìm thấy không liệt kê bất kỳ tệp nào:
from subprocess import Popen
import sys
p = Popen(['find'] + sys.argv)
out, err = p.communicate()
if p.returncode:
sys.exit(p.returncode)
if not out:
sys.exit(1)
Đây là đầu ra dòng lệnh:
$ python test.py . -maxdepth 1 -name notthere
$ echo $?
1
$ find . -maxdepth 1 -name notthere
$ echo $?
0
$ find . -failedarg
find: unknown predicate `-failedarg'
$ echo $?
1
Sau đó, đối với kết quả tìm thấy có lỗi nhưng tìm thấy tệp:
$ ls -lh
$ d--------- 2 jeff users 6 Feb 6 11:49 noentry
$ find .
.
./noentry
find: `./noentry': Permission denied
$ echo $?
1
$ find . | egrep '.*'
.
./noentry
find: `./noentry': Permission denied
$ echo $?
0
python ../test.py
../test.py
$ echo $?
1
Sau đó, nếu bạn muốn danh sách các tệp bạn có thể sử dụng -print 0
được chuyển đến find
và phân tách biến ra thành null hoặc bạn chỉ có thể thêm một câu lệnh in cho nó.
Nó không chỉ find
trả về mã trạng thái thoát là 0 khi thành công. Trong unix những gì bạn thực hiện lệnh, nếu nó thành công thì nó sẽ trả về trạng thái thoát là 0.
*
trênegrep
regex là hoàn toàn dư thừa. Vì bạn không sử dụngegrep
cú pháp biểu thức chính quy, đơn giản cũgrep
có thể nhanh hơn vài micrô giây.