ฉันมีมากกว่า 200 .zip
ไฟล์ในโฟลเดอร์เดียว ฉันไม่ต้องการขยายมันทีละอัน ฉันต้องการแยกข้อมูลเหล่านั้นโดยใช้คำสั่งเดียวหรือสคริปต์ วิธีการทำ
ฉันมีมากกว่า 200 .zip
ไฟล์ในโฟลเดอร์เดียว ฉันไม่ต้องการขยายมันทีละอัน ฉันต้องการแยกข้อมูลเหล่านั้นโดยใช้คำสั่งเดียวหรือสคริปต์ วิธีการทำ
คำตอบ:
หากคุณต้องการคลายการบีบอัดข้อมูลแบบขนานคุณสามารถทำได้
for i in *zip; do unzip "$i" & done
อย่างไรก็ตามจะเปิดใช้งานกระบวนการ N สำหรับไฟล์ N. zip และอาจหนักมากในระบบของคุณ สำหรับวิธีการที่ควบคุมได้มากขึ้นการเรียกใช้กระบวนการแบบขนานเพียง 10 กระบวนการในแต่ละครั้งให้ลองสิ่งนี้:
find . -name '*.zip' -print0 | xargs -0 -I {} -P 10 unzip {}
หากต้องการควบคุมจำนวนกระบวนการแบบขนานที่เปิดใช้ให้เปลี่ยน-P
เป็นสิ่งที่คุณต้องการ หากคุณไม่ต้องการเรียกเก็บเงินคืนในไดเรกทอรีย่อยให้ทำเช่นนี้แทน:
find . -maxdepth 1 -name '*.zip' -print0 | xargs -0 -I {} -P 10 unzip {}
หรือคุณสามารถติดตั้งGNU ขนานตามที่แนะนำโดย @OleTange ในคอมเม้นต์และรัน
parallel unzip ::: *zip
-exec
หรือแทนท่อไป-execdir
xargs
ไม่เพียง แต่จะเข้าใจได้ง่ายขึ้น แต่ยังมีข้อผิดพลาดน้อยกว่าและใช้ทรัพยากรระบบน้อยลง find . -name '*.zip' -exec unzip {} ';'
(คุณต้องพูดกึ่งลำไส้ใหญ่.)
-exec \;
(คุณสามารถหนีเครื่องหมายอัฒภาคไม่จำเป็นต้องมีเครื่องหมายคำพูด) จะเรียกใช้แต่ละคำสั่งตามลำดับ -exec +
ดีกว่า แต่มันจะไม่ทำงานที่นี่เพราะมันไม่unzip
ทำงาน
ขนาน GNUคำสั่งมีความเหมาะสมดีกับชนิดของสิ่งนี้ หลังจาก:
$ sudo apt-get install parallel
แล้วก็
ls *.zip | parallel unzip
สิ่งนี้จะใช้คอร์มากเท่าที่คุณมีทำให้แต่ละคอร์ไม่ว่างด้วยการคลายซิปจนกว่าจะเสร็จสิ้น
echo *.zip
แทนเพื่อป้องกันไม่ให้ชื่อแทนที่เป็นไปได้จากการแอบดูข้อมูลเพิ่มเติม อย่างไรก็ตามสิ่งนี้มีปัญหาเช่นเดียวกับคำตอบของ @ Guru แต่จะแบ่งตามชื่อไฟล์ที่มีช่องว่าง
xargs
GNU Parallel ไม่ได้ทำลายชื่อไฟล์ที่มีช่องว่าง / tab / quote เฉพาะในกรณีที่ชื่อไฟล์มีการขึ้นบรรทัดใหม่คุณจะต้องระมัดระวังเป็นพิเศษ ตัวอย่างเช่นโดยใช้:parallel unzip ::: *.zip
echo
ls
การลูบและการวนซ้ำเป็นสิ่งที่ปลอดภัยที่สุด
คุณสามารถใช้คำสั่งต่อไปนี้:
เปลี่ยนไดเรกทอรีแรกในเทอร์มินัลเป็นไดเรกทอรีที่มีไฟล์. zip
cd /path
จากนั้นดำเนินการคำสั่งนี้เพื่อคลายซิปไฟล์. zip ทั้งหมด:
for z in *.zip; do unzip "$z"; done
หากคุณมี.zip
ไฟล์จำนวนมากในโฟลเดอร์ของคุณและคุณต้องการแตกไฟล์ทั้งหมดให้เปิดเทอร์มินัลแล้วไปที่โฟลเดอร์ของคุณโดยใช้:
cd <path_to_folder>
ตอนนี้ใช้คำสั่งนี้เพื่อขยาย.zip
ไฟล์ทั้งหมดของคุณ:
ls *.zip | xargs -n1 unzip
echo *.zip
แทนเพื่อป้องกันls
นามแฝงที่เป็นไปได้จากการแอบดูข้อมูลเพิ่มเติมอย่างไรก็ตามยังไม่สามารถแก้ไขปัญหาช่องว่าง
ls
สำหรับสคริปต์เนื่องจากเอาต์พุตไม่ได้ถูกกำหนดอย่างชัดเจนระหว่างเวอร์ชัน ให้ดูคำตอบจาก @terdon แทนเพราะมันจะแก้ปัญหาทั้งหมดของการแก้ปัญหานี้
คุณสามารถใช้ find with -exec
like so,
find . -name "*.zip" -exec unzip {} \;
สิ่งนี้จะใช้ได้หากไฟล์มีช่องว่างในชื่อ
วิธีการที่ไม่ใช่ขั้ว
extract here
เพียงแค่เลือกไฟล์ซิปให้คลิกขวาที่หนึ่งและเลือก คุณสามารถเลือกไฟล์ซิปทั้งหมดหรือเพียงบางไฟล์ในเวลาเดียวกัน
unzip \*.zip
หรือ unzip '*.zip'
ชัดเจนunzip *.zip
ไม่ทำงานเพราะเปลือกขยายไปunzip foo.zip bar.zip ...
และunzip
ตีความชื่อไฟล์แรกเป็นไฟล์ซิปและชื่อไฟล์ต่อไปนี้เป็นไฟล์ที่จะแยกจากไฟล์ซิปที่
อย่างไรก็ตามunzip
เป็นเรื่องแปลกในหมู่คำสั่งของ Unix ที่มันทำหน้าที่ขยายตัวเอง หาก*
ไม่ได้ขยายโดยเชลล์ให้ unzip ทำและแทรกชื่อไฟล์ที่ได้ทั้งหมดเป็นไฟล์ซิปที่ต้องดำเนินการ ดังนั้นในกรณีพิเศษนี้ใคร ๆ ก็สามารถหนีไปได้โดยไม่มีfor
ลูปหรืออะไรxargs
ทำนองนั้น