หา -exec dry run?
มีวิธีดูว่าผลลัพธ์ของ a find . -exec somecommand {} \;จะเป็นอย่างไรโดยไม่ต้องรันคำสั่งจริง ๆ ? เช่นเดียวกับการทำงานแบบแห้ง (หรือทดสอบการทำงานหรือพิมพ์)?
ตัวอย่างเช่นสมมติว่าฉันมีโครงสร้างไฟล์ต่อไปนี้:
/a/1.txt
/a/2.txt
/a/b/3.txt
มีวิธีทดสอบfind . type f -exec rm {} \;จากภายในaไดเร็กทอรีเพื่อให้เอาต์พุตถูกพิมพ์ไปยัง stdout แต่ไม่ได้ดำเนินการเช่น:
rm 1.txt
rm 2.txt
rm b/3.txt
Update Note: rmเป็นเพียงคำสั่งตัวอย่างฉันสนใจในกรณีทั่วไป
คำตอบ
คุณสามารถเรียกใช้echo rmแทนrm
find . type f -exec echo rm {} \;
นอกจากนี้ยังfindมี-deleteตัวเลือกในการลบไฟล์ที่พบ
สำหรับrmเฉพาะคุณไม่จำเป็นต้อง-exec: ทำงานเพียงแค่find . -type fไปที่รายการและเพิ่ม-deleteเพื่อลบไฟล์ที่ระบุไว้โดยคำสั่งก่อนหน้า (ชัดยกเว้นไฟล์ที่ตรงกันใด ๆ ที่ถูกสร้างขึ้น / ลบในขณะเดียวกัน)
นอกจากนี้สำหรับคำสั่งเช่นrmซึ่งใช้อาร์กิวเมนต์ตามจำนวนที่กำหนดคุณจะต้องแทนที่\;ด้วย+เพื่อเรียกใช้คำสั่งให้น้อยที่สุด
เป็นเรื่องที่น่าฟัง แต่ไม่เหมือนกับวิธีการใช้echoโค้ดเอาต์พุตด้านล่างที่คุณสามารถเรียกใช้ในเชลล์ของคุณได้โดยไม่มีการเปลี่ยนแปลงใด ๆ เพื่อให้ได้ผลลัพธ์ที่ถูกต้องแม้ว่าชื่อไฟล์ของคุณจะมีเครื่องหมายคำพูดช่องว่างเมตาชาอักขระของเชลล์ ฯลฯ
printcmd() { printf '%q ' "$@"; printf '\n'; } find . -exec bash -c "$(declare -f printcmd); "'printcmd "$@"' _ \
somecommand {} \;
โปรดทราบว่าสตริงที่เรานำหน้าไปยัง-execอาร์กิวเมนต์ของเรานั้นแม่นยำbash -c "$(declare -f printcmd); "'printcmd "$@"' _- ส่วน$(declare -f printcmd)ขยายเป็นโค้ดสำหรับฟังก์ชัน หลังจากนั้นเราจริงเรียกฟังก์ชั่นที่มีการขัดแย้ง$1และเป็นต้นไปและใส่เป็นตัวยึดสำหรับ_$0
คุณสามารถแทนที่zshหรือkshแทน bash ได้หากคุณต้องการให้เอาต์พุตเป็นค่า Escape สำหรับเชลล์นั้น