ฉันจะ จำกัด จำนวนไฟล์ที่พิมพ์โดย ls ได้อย่างไร


89

มีวิธี จำกัด ปริมาณไฟล์ที่ระบุในlsคำสั่งหรือไม่?

ฉันเคยเห็น:

ls | head -4

แต่จะได้รับheadหรือtailดำเนินการฉันต้องรอlsให้การดำเนินการเสร็จสิ้นและไดเรกทอรีที่มีไฟล์จำนวน enourmous ซึ่งอาจใช้เวลานาน

ฉันต้องการรันlsคำสั่งที่ จำกัด โดยไม่ใช้headคำสั่งนั้น

คำตอบ:


109

คุณเคยลองไหม

ls -U | head -4

สิ่งนี้ควรข้ามการเรียงลำดับซึ่งอาจเป็นสาเหตุที่lsใช้เวลานานมาก

https://stackoverflow.com/questions/40193/quick-ls-command


"ls -U" ยังคงอ่านไดเรกทอรีทั้งหมดก่อนที่จะพิมพ์ ... ฉันคิดว่าฉันจะเขียนสคริปต์ขนาดเล็กเพื่อ จำกัด ไฟล์ แต่ลิงก์คำถามนั้นเป็นเนื้อหาการอ่านที่ดี ขอบคุณ niko
AndreDurao

5
@AndreDurao, GNU ls -Uไม่จำเป็นต้องอ่านไดเรกทอรีทั้งหมดก่อนที่จะพิมพ์ ลองstrace -e getdents,write ls -U > /dev/nullในไดเรกทอรีขนาดใหญ่เช่น
Stéphane Chazelas

เพียงหมายเหตุ: หากคุณต้องการรัน strace บน OSX ให้มองหา dtrace คำสั่ง strace คือยูทิลิตี Linux
AndreDurao

12

หากรุ่นของคุณlsมีวิธีที่จะไม่เรียงลำดับไฟล์เช่น-Uสำหรับ GNU lsให้ใช้มัน เมื่อไม่มีตัวเลือกlsจะอ่านไฟล์ทั้งหมดก่อนแล้วจึงเรียงชื่อแล้วเริ่มพิมพ์

ความเป็นไปได้อีกอย่างก็คือเรียกใช้findซึ่งพิมพ์ชื่อตามที่พบ

find . -name . -o -prune | head

(โปรดทราบว่าเนื่องจากheadทำงานในบรรทัดถือว่าชื่อไฟล์ไม่มีอักขระขึ้นบรรทัดใหม่)


1
โปรดทราบว่าในกรณีของ GNU find(ตรงข้ามกับ busybox หรือ heirloom findหรือ GNU ls -U) ดูเหมือนว่าจะอ่านไดเรกทอรีทั้งหมดก่อนที่จะเริ่มพิมพ์
Stéphane Chazelas

4

บางทีคุณอาจต้องการเครื่องมืออื่นนอกเหนือจากls?

ตัวอย่างเช่น Randal Schwartz มีรายการบล็อกเกี่ยวกับการใช้perlในไดเรกทอรีขนาดใหญ่ที่อาจมีคำแนะนำในการสร้างสิ่งที่ตรงกับความต้องการของคุณ

ในบล็อกที่โพสต์แรนดัลอธิบายว่าทั้งคู่lsและfindพยายามอ่านในรายการไดเรกทอรีทั้งหมดก่อนที่จะพิมพ์ใด ๆ ในขณะที่perlวิธีแก้ปัญหาที่เขาเสนอไม่ได้


ฉันยังคิดว่าอาจเป็นตัวเลือกที่ดีที่สุดเพราะทั้ง ls และ find อ่านไดเรกทอรีทั้งหมดก่อนที่จะพิมพ์ ฉันวางแผนที่จะเขียนสคริปต์ทับทิมเพื่อทำสิ่งนั้นแทนไข่มุกขอบคุณสำหรับ AFresh1!
AndreDurao

1
@AndreDurao, perlอาจจะใช้readdir(3)เหมือนหรือls ใน GNU / Linux เวอร์ชันปัจจุบันอย่างน้อยจะเรียกการเรียกของระบบด้วยการนับจำนวนมาก แต่ในกรณีของคุณหากคุณต้องการไฟล์น้อยลงดูเหมือนว่าคุณจะต้องเลี่ยงผ่านและใช้ BSD หรือการโทรของระบบแทน findreaddir(3)getdents()readdirgetdirentries(3)getdents(2)
Stéphane Chazelas

3

หากประสิทธิภาพไม่ใช่สิ่งที่น่าเป็นห่วง (อย่างเช่นในคำถามที่ถูกปิดซ้ำกับไฟล์นี้) และคุณต้องการแสดงรายการไฟล์ n ไฟล์แรก (ตรงข้ามกับ n บรรทัดแรกของเอาต์พุตls) ในรายการที่ไม่ใช่ - ไฟล์ที่ซ่อนเรียงตามชื่อไฟล์ด้วยzshคุณสามารถใช้:

ls -ld -- *([1,4])

เพื่อแสดงรายการ 4 ไฟล์แรก zshจะยังคงอ่านเนื้อหาทั้งหมดของไดเรกทอรีแม้ว่าแม้ว่าคุณจะบอกได้ว่ามันไม่ได้ในการจัดเรียงด้วย*(oN[1,4])(ทราบว่าls ยังเรียงลำดับรายการนั้น)


1

อาจจะน้อยกว่านั้นเหมาะสำหรับความต้องการของคุณ

 ls /usr/bin | less

สำหรับฉันมันใช้งานได้ทันทีบนแล็ปท็อปอายุ 5 ปีพร้อม HDD แบบคลาสสิค แต่หัวก็เร็วพอ ๆ กัน

คุณสามารถบอกเลิกก่อนเวลาอันควรด้วยlessq

ฉันเดาว่าสมมติฐานของคุณเกี่ยวกับแหล่งที่มาของการหน่วงเวลา 1 วินาทีนั้นผิด แต่อาจขึ้นอยู่กับ Unix-flavor หรือเชลล์ของคุณคำสั่งน้อยหรือคำสั่ง head

บน Linux ด้วย GNU-ls

 ls -R /usr | less 

เริ่มการส่งออกทันทีสำหรับฉันในขณะที่เอาต์พุตทั้งหมดกำลังทำงานและไม่ได้ทำงาน - ดังนั้นจึงไม่เสร็จแน่นอนก่อนที่จะเริ่มน้อยลง คุณอาจตรวจสอบว่าคุณมีการหน่วงเวลา 1 วินาทีหรือมากกว่านั้นขึ้นอยู่กับเอาต์พุตหรือไม่

ฉันเดาว่าการหน่วงเวลา 1 วินาทีของคุณมีเหตุผลที่แตกต่างกันบางที HDD กำลังจะเข้าสู่โหมดสลีและต้องการการปลุก

คุณมีความล่าช้าเช่นนี้สำหรับไฟล์น้อยเกินไปหรือไม่?


ขอบคุณ แต่ฉันไม่ได้มองหาอะไรแบบนั้น เช่นเดียวกับส่วนหัวโดยน้อยกว่าจะถูกดำเนินการกับผลลัพธ์ของlsผลลัพธ์ทั้งหมด ฉันกำลังมองหาวิธีที่จะ จำกัด ตัวเองเพื่อ จำกัด จำนวนผลลัพธ์
AndreDurao

@AndreDurao: ย้ายความคิดเห็นของฉันเป็นคำตอบ
ผู้ใช้ที่ไม่รู้จัก

0
ls -lrth | tail

ls -lrth | tail -n 10

ls -lrth | grep *.gz | tail

ฉันขอโทษ Abhishek แต่ประเด็นของคำถามนี้คือการใช้ประโยชน์จากlsคำสั่งทุบตี ประปาคำสั่งเช่นgrep, head, tailหรือคนอื่น ๆ จะดำเนินการหลังจากที่ls
AndreDurao

0
$ cut -f 1,n filename

จะทำหน้าที่ดึงnไฟล์ แรก nคือจำนวนไฟล์ที่คุณต้องการแตกไฟล์ รหัสที่สมบูรณ์ดังนั้นจะเป็น:

$ ls|cut -f 1,n file

1
ls | cut -f 1,n fileคำสั่งที่คุณจะเอาท์พุทฟิลด์แรกและที่ n ในแต่ละบรรทัดของข้อความในปัญหาและสมบูรณ์จะไม่สนใจการส่งออกของfile lsสิ่งนี้ไม่ได้ทำในสิ่งที่โปสเตอร์ดั้งเดิมต้องการ
telcoM

ใช่คุณพูดถูก หัว -n ... นี่จะทำหน้าที่แน่นอน
Ramandeep Singh
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.