แยกออกจากการค้นหาหาก -exec ล้มเหลว


14

มีวิธีการเขียนfindเพื่อที่จะแบ่งหากหนึ่งใน-execการดำเนินงานล้มเหลวในไฟล์หรือไม่

เช่น ( javacใช้สะดวกเป็นโปรแกรมที่สามารถส่งคืนรหัสออก 1 ในบางไฟล์และไม่มีเหตุผลอื่น):

$ echo "public classXX A{}" >> A.java
$ echo "public class B{}" >> B.java
$ find . -iname \*.java -exec javac {} \;
./A.java:1: error: class, interface, or enum expected
public classXX A{}
       ^
1 error

ในตัวอย่างด้านบนถึงแม้ว่าexecไฟล์ในไฟล์A.javaล้มเหลว (และส่งคืนโค้ดการออกเป็น 1) findคำสั่งจะดำเนินการและคอมไพล์ไฟล์B.javaเช่นกัน มีวิธีแบ่งfindหรือควรใช้รูปแบบบางอย่างforแทนหรือไม่

รุ่นที่ฉันค้นหา:

$ find -version  | head -1
find (GNU findutils) 4.4.2

คำตอบ:


5

ฉันคิด...

find ... -exec sh -c 'cmd "$0" || kill $PPID' \{\} \;

... findควรทำเคล็ดลับสำหรับเพียงใดเกี่ยวกับ


ขอบคุณ @Gilles อะไร$0ทำอย่างไร
mikeserv

1
$0เป็นอาร์กิวเมนต์แรกของsh -c( $1คืออันที่สองเป็นต้น) - ตามปกติชื่อของโปรแกรมที่ถูกเรียกใช้งาน แต่ที่นี่คุณกำลังเรียกใช้ตัวอย่างและส่งผ่านชื่อไฟล์ที่กำลังถูกประมวลผลตาม$0ความเหมาะสม (เช่นคุณเห็นได้ง่าย มันในps) มีโรงเรียนแห่งความคิด (ซึ่งเห็นได้ชัดว่าฉันไม่ได้เป็นของ) ที่ระบุว่า$0ควรจะปฏิบัติได้และคุณควรเขียนsh -c 'cmd "$1" …' sh {}หรือบางอย่าง
Gilles 'SO- หยุดความชั่วร้าย'

@Gilles - เนียนสวย ขอบคุณมาก. ฉันพบมันในรถระหว่างทางไปโรงเรียนอนุบาล แต่ฉันต้องคิดเรื่องนี้หลายนาที นั่นฉลาด - ฉันจะใช้มัน สิ่งที่ฉันคลิกจริง ๆ สำหรับฉันคือการแก้ไขฉันจำได้ว่าอ่านสเตฟานจากหนึ่งในโพสต์ของคุณซึ่งเขาเพิ่มfind-sh $0ไว้ในส่วนท้ายของfindข้อความ ดูเหมือนว่าจะมีประโยชน์มากกว่าในความคิดของฉัน แต่ฉันคิดว่ามันเป็นสิ่งที่คุณหลังจากในระยะยาวที่สำคัญที่สุด
mikeserv

มันไม่ทำงานสำหรับกรณีข้างต้น หลังจากfind . -iname \*.java -exec sh -c 'javac "${0}" || kill '$$ {} \;ไฟล์A.javaล้มเหลวและยังไฟล์ B.java ได้รับการรวบรวม
Marcus Junius Brutus

@ MarcusJuniusBrutus - ฉันแก้ไขแล้ว ฉันควรจะเห็นความคิดเห็นของคุณก่อนหน้านี้ อีกครั้งขอโทษ
mikeserv

4

อย่างน้อยด้วย GNU findคุณสามารถใช้:

find ... -exec ... -o -quit

ฉันดูเหมือนจะมีปัญหาในการทำให้ชัดเจนว่าที่ผู้บริหารหยุดและ -o เริ่ม ทั้งสองfind . -iname \*.java -exec javac {} -o -quit \;และfind . -iname \*.java -exec javac {} \; -o -quit \;ล้มเหลว (ในรูปแบบที่แตกต่างกัน)
Marcus Junius Brutus

@MarcusJuniusBrutus \;เป็นสิ่งจำเป็นที่และของ-exec(เช่นก่อนหน้า-o -quitนี้ในกรณีนี้) แต่อาจจะไม่มีที่ไหนเลย
Hauke ​​Laging

2
การใช้งาน-exec ... -o -quitไม่ได้สำหรับฉัน มันไม่ได้ประมวลผลไฟล์ใด ๆ แต่บรรทัดนี้ทำงาน: find . -iname \*.java -not -exec javac '{}' \; -quit: -quitเรียกว่าถ้า-execเป็นเท็จเช่น ผลตอบแทนที่ไม่ใช่ศูนย์
savanto

find . -iname \*.java -exec javac {} \; -o -quitเช่นกันล้มเหลวในการประมวลผลไฟล์ใด ๆ อย่างแปลกประหลาดfind . -iname \* -exec echo 'foo' \; -o -quit จะ "ประมวลผล" ไฟล์
Marcus Junius Brutus

0

ศึกษาfindคู่มือของคุณ @ คำตอบของ Hauke ​​ทำให้ฉันดูและ QNX พบว่ามี-abortตัวเลือกที่คล้ายกับ-quitตัวเลือกGNU มันใช้งานได้สำหรับฉันหากฉันใช้\(และ\)สำนวนกลุ่ม:

find . -mtime -4 -name <pattern> \( -exec my_cmd {} \; -o  -abort \) 

หมายเหตุ: หากไม่มี parens จะเป็นการยกเลิกไฟล์แรก

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.