มีเหตุผลที่คุณพยายามทำสิ่งนี้ในคำสั่งแบบหนึ่งซับหรือไม่? มันซับซ้อนพอที่จะจัดการได้ง่ายกว่าในฐานะเชลล์สคริปต์ขนาดเล็ก แต่ถ้าคุณต้องการหนึ่งซับนี่คือตัวอย่างที่โดยทั่วไปคือ bash loop ที่เรียกใช้ pdfgrep ตามตัวอย่างของคุณ:
while read line; do file=$(echo $line|awk -F: '{print $1}');printf "$file: "; echo "$line"|grep -q :0$ && echo no match && continue;echo MATCH;mv -i "$file" DESTINATION/;done < <(find TARGET/ -type f -iname '*.pdf' -exec pdfgrep -Hc -m 1 "DESIRE STRING" {} \;)
โปรดทราบว่า pdfgrep ใช้ตัวเลือก "-c" เพื่อตรวจสอบว่าข้อความนั้นอยู่ในไฟล์ PDF หรือไม่ จะใช้ตัวเลือก "-m 1" เพื่อหยุดหลังจากการแข่งขันครั้งแรกดังนั้นในทางทฤษฎีควรทำงานได้เร็วขึ้นในไฟล์ขนาดใหญ่
หาก pdfgrep ของคุณไม่รองรับตัวเลือก "-m 1" ให้ปล่อยบิตนั้นทิ้ง
และเพื่อให้อ่านง่ายขึ้นนี่คือรหัสที่อาจปรากฏในสคริปต์ทุบตี:
#!/bin/bash
while read line; do
file=$(echo $line|awk -F: '{print $1}')
printf "$file: "
echo "$line"|grep -q :0$ && echo no match && continue
echo MATCH
mv -i "$file" DESTINATION/
done < <(find TARGET/ -type f -iname '*.pdf' -exec pdfgrep -Hc "DESIRE STRING" {} \;)
คำอธิบายรหัสทีละบรรทัด:
นี่คือล่ามบรรทัดคำสั่ง หากสคริปต์นั้นสามารถเรียกใช้งานได้ (คุณสามารถทำให้สามารถเรียกใช้งานได้ด้วยคำสั่ง "chmod + x mv-pdf-files.sh") คุณสามารถเรียกใช้งานได้เช่น "./mv-pdf-files.sh" และมันจะใช้ / bin / bash เพื่อเรียกใช้สคริปต์
นี่คือการทุบตีในขณะที่วง มันวนซ้ำทุกบรรทัดของเอาต์พุตที่สร้างโดยคำสั่งที่ส่วนท้ายสุดของสคริปต์ (คำสั่ง "find")
สิ่งนี้จะดึงชื่อไฟล์จากบรรทัดเอาต์พุตและบันทึกลงในตัวแปร (ชื่อ "ไฟล์")
สิ่งนี้จะพิมพ์ชื่อไฟล์ไปที่เอาต์พุตมาตรฐานโดยไม่มีบรรทัดใหม่ที่ท้าย
คำสั่ง grep นี้ค้นหา ": 0" ที่ท้ายบรรทัดซึ่งระบุว่าพบรายการที่ตรงกันของ STRING ใน PDF นั้น คำสั่ง && ถูกรวมเข้าด้วยกัน; ดังนั้นหากไม่พบที่ตรงกันคำสั่ง echo จะถูกเรียกใช้จากนั้นจะเรียก bash "ดำเนินการต่อ" ซึ่งข้ามไปยังไฟล์ถัดไปในลูป (เช่นกลับไปที่บรรทัดรหัส # 3)
นี่เป็นเพียงเสียงสะท้อนที่พบการแข่งขัน
นี่คือคำสั่ง mv จริงเช่นเดียวกับในรหัสของคุณ
"เสร็จสิ้น" หมายถึงจุดสิ้นสุดของ while loop คำสั่ง "find" ที่อยู่ในเครื่องหมาย <<() คือสิ่งที่ while while วนซ้ำ คำสั่ง find นั้นจะค้นหาไฟล์ทั้งหมดในพา ธ ที่ระบุ (TARGET /) ที่ลงท้ายด้วย. pdf (ตัวพิมพ์เล็กและตัวพิมพ์ใหญ่) พารามิเตอร์ -exec บอกให้ find รันคำสั่ง "pdfgrep" ในแต่ละไฟล์โดยใช้ -H เพื่อพิมพ์ชื่อไฟล์และ "-c" เพื่อพิมพ์จำนวนการจับคู่ของ STRING ที่พบในไฟล์ PDF อักขระ {} ที่ท้ายถูกใช้ภายในโดย "find" เพื่อแทนชื่อไฟล์เป็นตัวแปร