รวมผลลัพธ์จากคำสั่ง "ค้นหา" สองคำสั่ง


0

ฉันต้องการที่จะหาไดเรกทอรีทั้งหมดที่มีทั้งและการจับคู่ไฟล์Makefile *.texคำสั่งfindหรือlocateค้นหาหนึ่งหรืออื่น ๆ ได้อย่างง่ายดาย แต่ผลลัพธ์เหล่านั้นจะถูกผสานหรือตัดกันอย่างไรเพื่อให้ได้ไดเรกทอรีที่ต้องการ

คำตอบที่เป็นประโยชน์จะสรุปชื่อไฟล์อื่น ๆ ยิ่งไปกว่านั้นมันสามารถรวมแบบสอบถามมากกว่าสองรายการได้

(ฉันไม่เห็นวิธีการใช้findตัวดำเนินการบูลีนของ "เช่น" และ " expr1 -a expr2. locate -Aเหมือนกัน. อาจมีสองการค้นหา, ตัดชื่อไฟล์และเก็บเส้นทางsort -u, เข้าcomm -12 <(cmd1) <(cmd2)?)

คำตอบ:


4

เพียงใช้-aเงื่อนไข 'และ':

find . -type d -exec test -f {}/Makefile \; -a -exec bash -c 'compgen -G '{}'/*.tex >/dev/null;exit $?' \; -print

ใน Slow-mo:

  • -exec test -f {}/Makefile \;ตรวจสอบว่าMakefileมีอยู่ในไดเรกทอรี
  • -exec bash -c 'compgen -G '{}'/*.tex >/dev/null;exit $?'ตรวจสอบว่ามี*.texไฟล์ใด ๆในไดเรกทอรีหรือไม่
  • การทดสอบทั้งบรรทัดเป็นจริงเฉพาะในกรณีที่การทดสอบทั้งสองเป็นจริง
  • ในกรณีนั้นให้พิมพ์ชื่อไดเรกทอรี

วิ่งบน:

./no1
./no1/yes3
./no1/yes3/foo.tex
./no1/yes3/Makefile
./no1/no3
./no1/no
./no1/Makefile
./q
./no2
./no2/foo.tex
./yes1
./yes1/foo.tex
./yes1/Makefile
./yes2
./yes2/foo.tex
./yes2/Makefile

ให้:

./no1/yes3
./yes1
./yes2

1
+1 ฉันไม่เคยรู้เลยว่าคุณสามารถใช้-execเป็นแบบทดสอบได้ man findแสดงรายการการทดสอบและการกระทำแยกกันและ-execอยู่ภายใต้ "การกระทำ" ที่นั่น คำตอบของคุณคือสื่อการเรียนรู้สำหรับฉัน
Kamil Maciorowski

สำหรับฉัน ... ไม่เคยใช้มาcompgenก่อน
xenoid

คำตอบนี้ไม่สมบูรณ์แบบด้วยตัวเอง (เช่นไม่ได้กล่าวถึงว่าการ-aเชื่อมต่อการทดสอบโดยค่าเริ่มต้นคุณอาจละเว้น) แต่สิ่งที่ฉันเรียนรู้จากมันกลับกลายเป็นว่าทรงพลังมาก (การทดสอบที่กำหนดเองเช่นนี้ใช่!) มัน. ดีแล้วทำต่อไป.
Kamil Maciorowski

และเมื่อผมเริ่มใช้ระบบปฏิบัติการยูนิกซ์ผมคิดว่าหาเป็นคำสั่งที่ซับซ้อนกว่า :)
xenoid

1

findไม่สามารถ "ค้นหาย่อย" เพื่อพิมพ์ไดเรกทอรีที่มีไฟล์บางไฟล์ดังนั้นจึงcommเป็นวิธีที่จะไป:

comm -12 <(find . -name Makefile -exec dirname {} \; | sort ) <(find . -name '*.tex' -exec dirname {} \; | sort)

คุณสามารถวนซ้ำไดเรกทอรีต่างๆ (แบบวนซ้ำglobstar) ซึ่งอาจเร็วกว่า (ที่compgenมา ):

for directory in */
do
    if [ -e "${directory}/Makefile" ] && compgen -G "${directory}/"*.tex > /dev/null
    then
        printf '%s\n' "${directory}"
    fi
done

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