ฉันจะแสดงรายการจำนวนบรรทัดในไฟล์/group/book/four/word
เรียงลำดับตามจำนวนบรรทัดที่มีได้อย่างไร
ls -l
คำสั่งรายการพวกเขาลง แต่ไม่ได้จัดเรียงพวกเขา
ฉันจะแสดงรายการจำนวนบรรทัดในไฟล์/group/book/four/word
เรียงลำดับตามจำนวนบรรทัดที่มีได้อย่างไร
ls -l
คำสั่งรายการพวกเขาลง แต่ไม่ได้จัดเรียงพวกเขา
คำตอบ:
คุณควรใช้คำสั่งเช่นนี้:
find /group/book/four/word/ -type f -exec wc -l {} + | sort -rn
find
: ค้นหาไฟล์บนเส้นทางที่คุณต้องการ หากคุณไม่ต้องการให้เกิดขึ้นซ้ำและfind
การใช้งานของคุณรองรับคุณควรเพิ่ม-maxdepth 1
ก่อน-exec
ตัวเลือกexec
: บอกให้คำสั่งดำเนินการwc -l
ทุกไฟล์sort -rn
: จัดเรียงผลลัพธ์เป็นตัวเลขในลำดับย้อนกลับ จากมากไปน้อย(สมมติว่าชื่อไฟล์ไม่มีอักขระขึ้นบรรทัดใหม่)
wc
จะพิมพ์total
บรรทัดดังนั้นที่นี่คุณจะได้รับหนึ่งบรรทัด "รวม" เว้นแต่ว่ามีไฟล์เดียวเท่านั้น . คุณสามารถไปที่grep /
เพื่อลบ
sort
คำสั่ง
อาจเป็นเวอร์ชั่นที่ง่ายที่สุดถ้าคุณไม่ต้องการ recursivity:
wc -l /group/book/four/word/*|sort -n
wc
นับบรรทัด (ตัวเลือก-l
) ในทุก ๆ ไฟล์ (แต่ซ่อนอยู่) ( *
) /group/book/four/word/
และsort
เรียงลำดับผลลัพธ์ (ผ่านไปป์|
) เป็นตัวเลข (ตัวเลือก-n
)
มีคนแสดงความคิดเห็นกับคำตอบที่กล่าวถึงgrep -rlc
นี้ก่อนที่จะระงับ แน่นอนgrep
เป็นทางเลือกที่ดีโดยเฉพาะอย่างยิ่งถ้าคุณต้องการ recursivity:
grep -rc '^' /group/book/four/word/|tr ':' ' '|sort -n -k2
จะนับ (ตัวเลือก-c
) ซ้ำ (ตัวเลือก-r
) สายการจับคู่ ( grep
) '^'
(นั่นคือจุดเริ่มต้นของเส้น) /group/book/four/word/
ในไดเรกทอรี จากนั้นคุณต้องแทนที่โคลอนด้วยช่องว่างเช่นใช้tr
เพื่อช่วยsort
ซึ่งคุณต้องการเรียงลำดับตัวเลข (ตัวเลือก-n
) ในคอลัมน์ที่สอง (ตัวเลือก-k2
)
อัปเดต:ดูความคิดเห็นของสเตฟานเกี่ยวกับข้อ จำกัด ที่เป็นไปได้และวิธีกำจัดของtr
จริง
grep -c .
นับบรรทัดที่มีอักขระที่ถูกต้องอย่างน้อยหนึ่งตัว ใช้grep -c '^'
เพื่อนับบรรทัดทั้งหมด (จะนับจำนวนอักขระต่อท้ายหลังขึ้นบรรทัดใหม่ด้วยgrep
การปรับใช้บางอย่าง) โปรดทราบว่าgrep
การใช้งานไม่ได้ทั้งหมดสนับสนุน-r
และพฤติกรรมที่แตกต่างกันไปในหมู่ที่ทำ คุณไม่จำเป็นต้องแปล:
s (ลำไส้ใหญ่ไม่อัฒภาค) sort
ไปที่ช่องว่างสำหรับ -t:
ใช้เพียงแค่ โปรดทราบว่าสันนิษฐานว่าชื่อไฟล์ไม่มี:
หรือเว้นว่างหรือขึ้นบรรทัดใหม่
wc
ให้ผลรวมที่มีประโยชน์ทั้งหมดถ้าคุณผ่านหลายเส้นทาง การเชื่อมต่อการทำงานนั้นกับ wild card และไปป์ที่sort
สะอาดจริงๆ
ด้วยzsh
:
lines() REPLY=$(wc -l < $REPLY)
printf '%s\n' /group/book/four/word/*(.no+lines)
เรากำหนดฟังก์ชันการเรียงลำดับใหม่lines
ที่ตอบกลับด้วยจำนวนบรรทัดในไฟล์ และเราใช้ตัวระบุแบบo+lines
กลมซึ่งรวมกับn
(สำหรับการเรียงลำดับแบบตัวเลข) กำหนดวิธีการเรียงลำดับผลลัพธ์ของแบบกลม ( .
เพิ่มเพื่อตรวจสอบไฟล์ปกติเท่านั้น)
ทำให้ไม่มีการสันนิษฐานว่าอักขระชื่อไฟล์อาจมีอะไรนอกเหนือจากไฟล์ที่ซ่อนอยู่ (ที่ขึ้นต้นด้วย.
) จะถูกละเว้น เพิ่มตัวระบุD
รอบตัวถ้าคุณต้องการเช่นกัน
bash
เท่านั้น ...
คุณไม่ได้ระบุว่าคุณต้องการไฟล์ในไดเรกทอรีย่อย/group/book/four/word
หรือไม่ การfind
แก้ปัญหาในคำตอบของ jherran จะลงไปในไดเรกทอรีย่อย หากไม่ต้องการใช้เชลล์แทน:
for file in ./*; do [ -f "$file" ] && wc -l "$file"; done | sort -n
หากชื่อไฟล์ของคุณมีบรรทัดใหม่คุณสามารถใช้สิ่งต่อไปนี้:
for file in ./*; do
[ -f "$file" ] &&
printf "%lu %s\0" "$(wc -l < "$file")" "$file"
done | sort -zn | tr '\0' '\n'
สุดท้ายหากคุณทำลงไปลงในไดเรกทอรีย่อยคุณสามารถใช้ในbash
4 หรือสูงกว่า:
shopt -s globstar
for file in ./**/*; do [ -f "$file" ] && wc -l "$file"; done | sort -n
โปรดทราบว่าเวอร์ชันbash
ก่อนหน้า 4.3 มีการติดตาม symlink เมื่อเรียกแผนผังไดเรกทอรีซ้ำ (เช่นzsh
's หรือtcsh
' s ***/*
) ซ้ำ
นอกจากนี้โซลูชันทั้งหมดข้างต้นจะไม่สนใจไฟล์ที่ซ่อนอยู่ (ผู้ที่มีชื่อขึ้นต้นด้วย a .
ใช้shopt -s dotglob
เพื่อรวมไฟล์เหล่านั้น) และจะรวมจำนวนบรรทัดของลิงก์สัญลักษณ์ (ซึ่งfind
วิธีการจะไม่)
-xtype f
ใน GNU find หรือ*(-.)
in zsh) และจะละเว้นไฟล์ที่ซ่อนอยู่
%lu
อยู่ในprintf
? ตามที่ฉันจำได้นั่นหมายถึงทศนิยมที่ไม่ได้ลงนามยาวมันจำเป็นจริงๆหรือ? ทำไมไม่ถือว่าตัวเลขเป็นสตริง? มันสร้างความแตกต่างหรือไม่?
0
แทนที่จะเป็นสตริงว่างซึ่งดีกว่าเล็กน้อย การประยุกต์ใช้การเรียงลำดับบางอย่างทำงานกับจำนวนเต็มที่ไม่ได้ลงนามบางอย่างที่ลงนาม %lu
ฟังดูเหมือนการเดิมพันที่ปลอดภัยที่สุด แต่ก็ไม่สำคัญว่าคุณจะมี2^31
ไลน์หรือไม่
หากคุณต้องการติดตั้งfd
โปรแกรมค้นหาไฟล์ที่รวดเร็วจริงๆที่เขียนใน Rust (คุณควรติดตั้งมันก็ดีมากที่มีอยู่แล้ว)
fd --type=file . | xargs wc -l | sort -n
โดยทั่วไปfd
จะแสดงรายการไฟล์ xargs จะผ่านรายการของไฟล์ไปwc
(ย่อมาจากการนับจำนวนคำ แต่ผ่าน -l จะทำให้มันนับจำนวนบรรทัด) sort -n
แล้วในที่สุดก็เรียงลำดับจากจำนวนที่น้อยที่สุดของสายที่จะยิ่งใหญ่ที่สุดโดยใช้
ls -l
ไม่ได้ให้จำนวนบรรทัดls -lS
เรียงลำดับไฟล์ตามขนาดด้วยls
การนำไปใช้งานบางอย่าง( ขนาดเป็นจำนวนไบต์ในเนื้อหา)