ฉันจะรันคำสั่งในทุกไฟล์ในไดเรกทอรีที่กำหนดได้อย่างไร


0

ฉันใช้mp4boxเพื่อย้ายอะตอม MOOV บนไฟล์ MP4

สิ่งนี้คือฉันจะมี 6 ไฟล์ในโฟลเดอร์ที่กำหนดและฉันไม่ต้องการเรียกใช้inter 500คำสั่งหกครั้งแยกกัน

เป็นไปได้ไหมที่จะทำบางอย่างเช่นmp4box -inter 500 *ในไดเรกทอรีเพื่อให้คำสั่งรันไฟล์ mp4 ทั้งหมดในโฟลเดอร์นั้น

คำตอบ:


5

คุณสามารถใช้ตัวเลือกในการ-exec findที่นี่'{}'จะถูกแทนที่ด้วยชื่อไฟล์ของไฟล์ MP4 ทุกไฟล์ สิ่งนี้จะจัดการกับชื่อไฟล์ทุกประเภทแม้แต่ที่มีช่องว่างหรือขึ้นบรรทัดใหม่ คุณต้องระบุให้-maxdepth 1ค้นหาเฉพาะไดเรกทอรีปัจจุบัน

find . -iname "*.mp4" -maxdepth 1 -exec mp4box -inter 500 '{}' \;

ทางเลือกวิธีการที่ซับซ้อนมากขึ้นจะเกี่ยวข้องกับท่อเอาท์พุทจากเข้าไปในวงด้วยfind readที่นี่ทุกไฟล์จะถูกคั่นด้วยโดยNULตัวละครและคุณจำเป็นต้องบอกในการแยกสัญญาณเข้าบนตัวละครตัวนี้ซึ่งจะทำได้โดยread -d ''คุณต้องอ้างอิงตัวแปร"$file"ดังนั้นช่องว่างหรือตัวอักษรกลมในชื่อจะถูกเก็บไว้

find . -iname "*.mp4" -maxdepth 1 -print0 | while IFS= read -d '' -r file; do mp4box -inter 500 "$file"; done

หลังจากทำงานด้านบนฉันได้สิ่งนี้: ce_002.mp4: unknown primary or operatorฉันกำลังทำอะไรผิดที่นี่หรือไม่?
usr122212

สิ่งเดียวที่ฉันคิดได้ก็คือชื่อไฟล์ของคุณมีตัวละครแปลก ๆ ... ลองคำตอบที่อัปเดต
terdon

ขอบคุณสำหรับคำตอบที่อัพเดต! ใช้งานได้ดี ฉันควรอ่านเพิ่มเติมเกี่ยวกับ exec :)
usr122212

2
ฉันทำการแก้ไขบางอย่าง รูปแบบกลมที่-nameควรจะถูกยกมา มิฉะนั้น*จะถูกขยาย glob ก่อนที่findจะเห็นมัน หมายความว่าคำสั่งจะล้มเหลวหากคุณค้นหาในไดเรกทอรีอื่นที่ไม่ใช่ไดเรกทอรีปัจจุบันหรือลึกกว่าหนึ่งระดับ นอกจากนี้-execตัวเลือกยังเกี่ยวข้องกับชื่อไฟล์ทุกชนิด การใช้xargsไม่จำเป็นจริงๆ - การwhileวนซ้ำใช้งานได้ดีกว่า แต่ที่นี่ผลลัพธ์ควรมีการคั่นด้วย null
slhck

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