ฉันมีโฟลเดอร์ที่มีไฟล์. pdb.gz ประมาณ 320116 ฉันต้องการที่จะบีบอัดพวกเขาทั้งหมด ถ้าฉันใช้ gunzip * .gz มันทำให้ฉันมีข้อผิดพลาดคือรายการอาร์กิวเมนต์ยาวเกินไป โฟลเดอร์มีขนาดประมาณ 2GB โปรดให้คำแนะนำที่เหมาะสมแก่ฉัน
ฉันมีโฟลเดอร์ที่มีไฟล์. pdb.gz ประมาณ 320116 ฉันต้องการที่จะบีบอัดพวกเขาทั้งหมด ถ้าฉันใช้ gunzip * .gz มันทำให้ฉันมีข้อผิดพลาดคือรายการอาร์กิวเมนต์ยาวเกินไป โฟลเดอร์มีขนาดประมาณ 2GB โปรดให้คำแนะนำที่เหมาะสมแก่ฉัน
คำตอบ:
find . -name '*.pdb.gz' -exec gunzip {} +
-exec gunzip {} +จะจัดเตรียมgunzipชื่อไฟล์จำนวนมาก แต่ไม่มากเกินไปในบรรทัดคำสั่ง ซึ่งมีประสิทธิภาพมากกว่า-exec gunzip {} \;ที่จะเริ่มgunzipกระบวนการใหม่สำหรับแต่ละไฟล์
findน้อยกว่าgunzip!
findอนุญาตให้ใช้เครื่องหมาย "+" ดูตัวอย่างเช่นหน้าคนสำหรับ BSD 10.1 ยังใช้กับ OS X (10.9 ขึ้นไปอย่างน้อยก็อาจเร็วกว่านี้) find
เมื่อใดก็ตามที่คุณได้รับข้อผิดพลาด "รายการอาร์กิวเมนต์ยาวเกินไป" คุณสามารถแก้ไขได้โดยเรียกคำสั่งที่ต้องการหลาย ๆ ครั้งแต่ละครั้งที่มีชุดย่อยของอาร์กิวเมนต์ที่คุณต้องการใช้ xargsเป็นเครื่องมือที่ช่วยให้คุณทำเช่นนั้นโดยอัตโนมัติ
find . -type f -a -name \*.pdb.gz -print0 | xargs -0 gunzip
-execdir gunzip "{}" \;ที่ xargs จะเรียกใช้ gunzip แยกกันสำหรับแต่ละไฟล์หรือไม่ นั่นคือการอ่านหน้ามนุษย์ของฉัน
xargsจะชื่อไฟล์มากเท่าที่จะพอดีกับgunzipบรรทัดคำสั่ง ลองมัน! echo a b c d e f | xargs echoเรียกใช้เพียงechoครั้งเดียวพร้อมอาร์กิวเมนต์ทั้งหมด 6 ข้อเพื่อให้คุณเห็นบรรทัดหนึ่งเอาต์พุต (คำสั่งที่ไม่มีประโยชน์พอที่จะดำเนินการได้ !!!!) ในขณะที่ถ้าคุณบังคับxargsให้จัดหาอาร์กิวเมนต์ได้มากถึง 3 ข้อต่อการเรียกใช้คำสั่งecho a b c d e f | xargs -n 3 echoนั้นคุณจะได้รับผลลัพธ์ 2 บรรทัด .
xargsคือด้วย-Pตัวเลือกคุณสามารถเรียกใช้หลายgunzipกระบวนการพร้อมกันซึ่ง (ขึ้นอยู่กับพารามิเตอร์ที่แน่นอนของระบบของคุณ) อาจทำงานได้เร็วขึ้น
-P@psmears ตอนนี้ฉันก็ได้เรียนรู้บางสิ่งด้วย!
ฉันคิดว่ามันควรจะทำงานได้มันจะผ่านพา ธ / ชื่อของแต่ละไฟล์ไปยัง gunzip เพื่อทำการประมวลผล:
find /my/dir -name "*.pdb.gz" -execdir gunzip "{}" \;
findด้วย+และxargsเป็นผู้ออกแบบอย่างชัดแจ้งโดยมีปัญหาในใจ พวกเขามักจะให้ข้อโต้แย้งมากที่สุดเท่าที่จะทำได้ในขณะที่ไม่เกินขีด จำกัด ของระบบปฏิบัติการ เพราะโดยวิธีการที่มันเป็นข้อ จำกัด gunzipของระบบปฏิบัติการอะไรจะทำอย่างไรกับ
ลองด้วยวิธีนี้:
find . -name '*.gz' -exec gunzip {} \;
gunzipหนึ่งครั้งต่อไฟล์ ดูคำตอบของ John1024สำหรับวิธีที่แตกต่างกันเล็กน้อยเพื่อหลีกเลี่ยงความไร้ประสิทธิภาพนั้น
หากคุณมีเครื่องมัลติคอร์คุณอาจจะเห็นว่าการใช้งานgunzipจะไม่ทำให้ความสามารถของเครื่องคุณสูงสุด เพื่อที่คุณจะต้องเรียกใช้หลายgunzips ในแบบคู่ขนาน หากต้องการติดตามว่าสิ่งใดที่เทอร์มินัลด้วยมือมีความยุ่งยาก แต่คุณสามารถทำได้โดยใช้ GNU ขนาน:
find . -name "*.gz" | parallel -X gunzip {}
parallelยาวเกินไปหรือไม่
findยาวเกินไป?
findบรรทัดคำสั่งของ
-name
ไม่จำเป็นต้องใช้findสำหรับสิ่งนี้เนื่องจากคุณไม่ได้พูดถึงโฟลเดอร์ย่อย สิ่งที่คุณต้องทำคือ:
for f in *.gz;do gunzip $f;done
findถ้าคุณไม่ต้องการที่จะวางไข่ 320,116 gunzipกระบวนการเช่นเดียวกับวงนี้ไม่