ฉันมีโฟลเดอร์ที่มีไฟล์. 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
จะไม่ทำให้ความสามารถของเครื่องคุณสูงสุด เพื่อที่คุณจะต้องเรียกใช้หลายgunzip
s ในแบบคู่ขนาน หากต้องการติดตามว่าสิ่งใดที่เทอร์มินัลด้วยมือมีความยุ่งยาก แต่คุณสามารถทำได้โดยใช้ GNU ขนาน:
find . -name "*.gz" | parallel -X gunzip {}
parallel
ยาวเกินไปหรือไม่
find
ยาวเกินไป?
find
บรรทัดคำสั่งของ
-name
ไม่จำเป็นต้องใช้find
สำหรับสิ่งนี้เนื่องจากคุณไม่ได้พูดถึงโฟลเดอร์ย่อย สิ่งที่คุณต้องทำคือ:
for f in *.gz;do gunzip $f;done
find
ถ้าคุณไม่ต้องการที่จะวางไข่ 320,116 gunzip
กระบวนการเช่นเดียวกับวงนี้ไม่