หา -exec dry run?

Dec 27 2020

มีวิธีดูว่าผลลัพธ์ของ 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เป็นเพียงคำสั่งตัวอย่างฉันสนใจในกรณีทั่วไป

คำตอบ

18 rAlen Dec 27 2020 at 07:10

คุณสามารถเรียกใช้echo rmแทนrm

find . type f -exec echo rm {} \;

นอกจากนี้ยังfindมี-deleteตัวเลือกในการลบไฟล์ที่พบ

3 l0b0 Dec 27 2020 at 07:28

สำหรับrmเฉพาะคุณไม่จำเป็นต้อง-exec: ทำงานเพียงแค่find . -type fไปที่รายการและเพิ่ม-deleteเพื่อลบไฟล์ที่ระบุไว้โดยคำสั่งก่อนหน้า (ชัดยกเว้นไฟล์ที่ตรงกันใด ๆ ที่ถูกสร้างขึ้น / ลบในขณะเดียวกัน)

นอกจากนี้สำหรับคำสั่งเช่นrmซึ่งใช้อาร์กิวเมนต์ตามจำนวนที่กำหนดคุณจะต้องแทนที่\;ด้วย+เพื่อเรียกใช้คำสั่งให้น้อยที่สุด

2 CharlesDuffy Dec 28 2020 at 00:38

เป็นเรื่องที่น่าฟัง แต่ไม่เหมือนกับวิธีการใช้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 สำหรับเชลล์นั้น