แม้ในขณะที่/tmp
ไม่มีไฟล์ที่เรียกsomething
ค้นหาด้วยfind
จะกลับ 0:
$ find /tmp -name something
$ echo $?
0
ฉันจะได้รับสถานะการออกที่ไม่ใช่ศูนย์find
ได้อย่างไรเมื่อไม่พบสิ่งใด
แม้ในขณะที่/tmp
ไม่มีไฟล์ที่เรียกsomething
ค้นหาด้วยfind
จะกลับ 0:
$ find /tmp -name something
$ echo $?
0
ฉันจะได้รับสถานะการออกที่ไม่ใช่ศูนย์find
ได้อย่างไรเมื่อไม่พบสิ่งใด
คำตอบ:
นี่คือหนึ่งในสายการบินที่ฉันเชื่อว่าทำในสิ่งที่คุณต้องการ:
find /tmp -name something | egrep '.*'
สถานะการส่งคืนจะเป็น0
เมื่อพบบางสิ่งและไม่เป็นศูนย์
หากคุณต้องการบันทึกผลลัพธ์find
สำหรับการประมวลผลเพิ่มเติมคำตอบของ Sven ก็ครอบคลุมไปด้วย
find ... | read
ทางออกที่ง่ายที่สุดที่ไม่ได้พิมพ์ แต่ออกจาก 0 เมื่อพบผลลัพธ์
find /tmp -name something | grep -q "."
Exit 0 นั้นง่ายต่อการค้นหา exit> 0 นั้นยากกว่าเพราะโดยปกติแล้วจะเกิดข้อผิดพลาดเท่านั้น อย่างไรก็ตามเราสามารถทำให้มันเกิดขึ้น:
if find -type f -exec false {} +
then
echo 'nothing found'
else
echo 'something found'
fi
find
ดูเหมือนว่ารหัสทางออกของจะไม่ขึ้นอยู่กับรหัสทางออกของสิ่งใดก็ตาม-exec
ที่ทำงานอยู่
exec
ส่วนไม่ใช่ภายใต้ค่าส่งคืน) ไม่สามารถแยกความแตกต่างระหว่างสิ่งที่พบและพบว่าตัวเองมีข้อผิดพลาด (เช่นเมื่อถูกเรียกใช้บนจุดเริ่มต้นที่ไม่มีอยู่จริง)
เมื่อพบคำถามนี้ในขณะที่พยายามหาวิธีแก้ไขปัญหา Puppet (เปลี่ยนการอนุญาตในโฟลเดอร์ภายใต้ไดเรกทอรี แต่ไม่ใช่ในไดเรกทอรี) ดูเหมือนว่าจะทำงานได้:
! test -z $(find /tmp -name something)
กรณีใช้งานเฉพาะของฉันคือ:
! test -z $(find /home -mindepth 1 -maxdepth 1 -perm -711)
ซึ่งจะออกจากรหัส 1 หากคำสั่ง find ไม่พบไฟล์ที่มีสิทธิ์ที่จำเป็น
มันเป็นไปไม่ได้. Find ส่งคืนค่า 0 หากออกจากระบบสำเร็จแม้ว่าจะไม่พบไฟล์ (ซึ่งเป็นผลลัพธ์ที่ถูกต้องไม่ได้ระบุข้อผิดพลาดเมื่อไม่มีไฟล์จริง ๆ )
เพื่ออ้างถึงค้นหา manpage
ออกจากสถานะ
ค้นหาทางออกด้วยสถานะ 0 หากไฟล์ทั้งหมดได้รับการประมวลผลสำเร็จมากกว่า 0 ถ้าเกิดข้อผิดพลาด นี่เป็นคำอธิบายที่กว้างมากโดยเจตนา แต่ถ้าค่าส่งคืนไม่ใช่ศูนย์คุณไม่ควรพึ่งพาความถูกต้องของผลลัพธ์การค้นหา
ขึ้นอยู่กับสิ่งที่คุณต้องการบรรลุคุณสามารถลองค้นหา-print
ชื่อไฟล์และทดสอบกับผลลัพธ์ของมัน:
#!/bin/bash
MYVAR=`find . -name "something" -print`
if [ -z "$MYVAR" ]; then
echo "Notfound"
else
echo $MYVAR
fi
exec
/ execdir
(ใช้กับ+
):If any invocation returns a non-zero value as exit status, then find returns a non-zero exit status.
ฉันรู้สึกว่านี่เป็นวิธีที่กระชับและตรงที่สุด:
test `find /tmp/ -name something -print -quit 2>/dev/null`
-print -quit
ซึ่งอาจแก้ไขข้อกังวลของคุณ
นี่คือฉันสคริปต์เล็ก ๆ น้อย ๆ test.py
ที่เรียกว่า จะปรับปรุงตามวิธีการอื่น ๆ ที่โพสต์ซึ่งจะส่งคืนรหัสข้อผิดพลาดหากมีการตั้งค่าไว้และจะเพิ่มหนึ่งหากพบไม่ได้แสดงรายการไฟล์ใด ๆ :
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)
นี่คือเอาต์พุตบรรทัดคำสั่ง:
$ python test.py . -maxdepth 1 -name notthere
$ echo $?
1
$ find . -maxdepth 1 -name notthere
$ echo $?
0
$ find . -failedarg
find: unknown predicate `-failedarg'
$ echo $?
1
จากนั้นสำหรับผลลัพธ์ที่พบว่ามีข้อผิดพลาด แต่พบไฟล์:
$ 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
จากนั้นหากคุณต้องการรายชื่อไฟล์คุณสามารถใช้-print 0
ผ่านfind
และแยกตัวแปรออกเป็นโมฆะหรือคุณเพียงแค่เพิ่มคำสั่งพิมพ์
ไม่เพียงfind
ส่งคืนรหัสสถานะการออกเป็นศูนย์เมื่อสำเร็จ ในยูนิกซ์สิ่งที่คำสั่งที่คุณดำเนินการถ้ามันประสบความสำเร็จก็จะส่งกลับสถานะออกเป็นศูนย์
*
บนegrep
regex ซ้ำซ้อนอย่างสมบูรณ์ เนื่องจากคุณไม่ได้ใช้egrep
ไวยากรณ์นิพจน์ปกติผู้สูงอายุgrep
อาจจะเร็วกว่าสองสามไมโครวินาที