มีวิธีการรวมขนาดไฟล์ที่ระบุไว้หรือไม่?


20

นี่คือคำสั่งที่ฉันใช้เพื่อแสดงรายการไฟล์:

find . -name \*.extract.sys -size +1000000c -exec ls -lrt {} \;
-rw-r--r--   1 qa1wrk15   test       1265190 Sep 29 01:14 ./var/can/projs/ar/rep/extract/Sep/29/ar.ARAB-PI_7.20110929.extract.sys
-rw-r--r--   1 qa1wrk15   test       1345554 Sep 29 01:14 ./var/can/projs/ar/rep/extract/Sep/29/ar.ARAB-PI_2.20110929.extract.sys
-rw-r--r--   1 qa1wrk15   test       1370532 Sep 29 01:14 ./var/can/projs/ar/rep/extract/Sep/29/ar.ARAB-PI_3.20110929.extract.sys
-rw-r--r--   1 qa1wrk15   test       1399854 Sep 29 01:14 ./var/can/projs/ar/rep/extract/Sep/29/ar.ARAB-PI_8.20110929.extract.sys

และอื่น ๆ

ตอนนี้ฉันต้องการคำนวณขนาดรวมของไฟล์เหล่านี้โดยสรุปคอลัมน์ที่ 5 ฉันคิดว่าจะใช้awkเพื่อทำสิ่งนี้ดังนั้นฉันจึงทดสอบสิ่งต่อไปนี้ในไดเรกทอรีเฉพาะ

>ls -lrt | awk `{ print $1 }`
ksh: syntax error at line 1 : `{' unmatched

ฉันไม่เข้าใจว่าปัญหาคืออะไรทำไมข้อผิดพลาดทางไวยากรณ์นี้

ฉันกำลังคิดจะลอง

ls -lrt | awk `BEGIN {total = 0} {for(i=0;i<NR;i++){total+=$5}} END {printf "%d",total} 

สิ่งนี้ก็เช่นกัน แต่awkสคริปต์ง่าย ๆไม่ทำงาน

กรุณาแนะนำหรือแก้ไขฉันหากฉันผิดหรือมีวิธีแก้ปัญหาสำหรับเรื่องนี้

คำตอบ:


26

ก่อนอื่นคุณควรใช้เครื่องหมายคำพูดเดี่ยว ( ') โดยตรงไม่ใช่ตัวเอียง ( `)

awkสคริปต์แบบอินไลน์อาจจะเป็นดังนี้

ls -lrt | awk '{ total += $5 }; END { print total }'

ดังนั้นไม่จำเป็นต้องเริ่มต้นtotal( awkเริ่มต้นเป็นศูนย์) และไม่จำเป็นต้องวนซ้ำawkดำเนินการสคริปต์ในทุกบรรทัดอินพุต


1
โดยสรุปหนึ่งซับจะเป็นเช่นนี้: find . -name \*.extract.sys -size +1000000c -exec ls -lrt {} \; | awk '{ total += $5 }; END { print total }'
helt


16

@enzotib ได้ชี้ให้เห็นแล้วว่าข้อผิดพลาดทางไวยากรณ์ของคุณคืออะไร - ฉันจะไปแทนเจนต์เล็กน้อย

การรวมคอลัมน์ตัวเลขเป็นหนึ่งในสิ่งเหล่านั้นที่โผล่ขึ้นมา ฉันลงเอยด้วยฟังก์ชั่นเชลล์นี้:

sumcol() 
{ 
    awk "{sum+=\$$1} END {print sum}"
}

ด้วยวิธีนี้โซลูชันของคุณจะกลายเป็น:

ls -lrt | sumcol 5

ที่จะรวมตัวเลขในคอลัมน์ 5 และพิมพ์ค่า


ด้วยเหตุนี้ฉันจึงสงสัยว่าทำไมไม่มีอรรถประโยชน์มาตรฐานสำหรับสิ่งนั้น
enzotib

เข้าไปใน.aliasesไฟล์ของฉัน
Konrad Rudolph

14

นี่เป็นอีกวิธีในการทำสิ่งนี้โดยใช้du:

find . -name \*.extract.sys -size +1000000c -print0 | du -c --files0-from=- | awk 'END{print $1}'

1
การใช้งานที่ยอดเยี่ยมของ du ตัวอย่างที่ดี ในฐานะที่เป็นประโยชน์เพิ่มเติมคุณสามารถเพิ่มตัวเลือก "-h" เพื่อ du เพื่อให้ได้ผลลัพธ์ในกิก จากนั้นคุณไม่ต้องนับตัวเลขและเช่นนั้น ฉันเพิ่งทำการทดสอบกับไฟล์จำนวนมากที่มีขนาดประมาณ 1188800 kbytes มันใหญ่แค่ไหน? ไม่สำคัญdu -ch --files0-from=-บอกฉันว่ายอดรวมของฉันคือ "9.0G" Sweeeet!
Mike S

การใช้งานที่ยอดเยี่ยมของ du!
haridsv

นอกจากนี้ถ้าคุณมีความสนใจเฉพาะรวมแล้วท่อ du tail -1ส่งออกไปยัง
haridsv

4

ในกรณีที่ HP-UX findมี-printfตัวเลือกเช่นกันซึ่งจะเป็นประโยชน์ในการเขียนสูตรสำหรับbcการคำนวณ:

( find . -name \*.extract.sys -size +1000000c -printf '%s+'; echo 0 ) | bc

หากสูตรมีขนาดใหญ่เกินไปก็สามารถคำนวณได้ทีละขั้นตอน:

( find . -name \*.extract.sys -size +1000000c -printf 's+=%s\n'; echo s ) | bc

1

ด้วย GNU find:

find -name '*.extract.sys' -size +1000000c -printf '%s\n' | jq -s add

ด้วย GNU stat:

find . -name '*.extract.sys' -size +1000000c -exec stat -c%s '{}' + | jq -s add

ด้วย BSD stat:

find . -name '*.extract.sys' -size +1000000c -exec stat -f%z '{}' + | jq -s add

เป็นjqยูทิลิตี้? ดูเหมือนจะไม่พบการแจกแจงเดเบียน (Debian 4.9.51-1 (2017-09-28) x86_64 GNU / Linux)
Death Metal
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.