อะไรคือจุดของ ls -f (หรือทำไมสิ่งนี้ถึงแขวนอยู่)


9

ฉันมีไดเรกทอรีที่มีประมาณ 100,000 ไฟล์อยู่ในนั้น ls -f ค้างไว้นานกว่าหนึ่งนาที ฉันวิ่งตาม strace และเริ่มเห็น getdents ในทันทีดังนั้น ls จึงอ่านไดเรกทอรีอย่างชัดเจน ฉันเห็นการโทรไปยัง brk เป็นจำนวนมากดังนั้น ls จึงบัฟเฟอร์สิ่งต่าง ๆ ในหน่วยความจำอย่างชัดเจน ฉันเขียนโปรแกรมง่าย ๆ ที่เรียก readdir และชื่อไฟล์ output และมันจะตอบสนองทันที แต่ ls -f ไม่ได้ให้ผลลัพธ์ สิ่งที่ช่วยให้? ฉันคิดว่าจุดทั้งหมดของ -f คือมันทำให้ ls ไม่ทำอะไรมากไปกว่า readdir มีวิธีพกพาและเชื่อถือได้ในการแสดงรายการเนื้อหาของไดเรกทอรีหรือไม่? (หมายเหตุนี่คือ ls จาก coreutils ของ gnu บน Linux)

-EDIT-

มีนามแฝงอยู่ในสถานที่ แต่ "/ bin / ls -1f> / dev / null" ใช้เวลา 8 ถึง 15 วินาที "/ bin / ls -1fx> / dev / null" ใช้เวลา 4 ถึง 11 วินาที แต่โปรแกรมง่าย ๆ นั่นเป็นเพียง readdir ใช้เวลา 0.011 วินาที ฉันต้องทำอะไรเพื่อทำให้ gnu ไม่ดูด

คำตอบ:


7

จุดประสงค์-fคือพยายามและหลีกเลี่ยงความจำเป็นในการสถิติทุกรายการไฟล์และเพื่อหลีกเลี่ยงความจำเป็นที่จะต้องอ่านพวกเขาทั้งหมดก่อนที่จะมีการแสดงใด ๆ มันเป็นตัวเลือก "เมตา" ที่เพิ่งปิดใช้งานตัวเลือกอื่น ๆ

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


2
Argghh ls () {/ bin / ls -FB $ @; } สคริปต์เริ่มต้นโง่
William Pursell

1
อืมม ฉันยกเลิกการตั้งค่าฟังก์ชั่นและฉันยังคงเห็นลักษณะการทำงานเดียวกันแม้ว่าฉันจะเรียกใช้ / bin / ls
วิลเลียม Pursell

ทำ / bin / ls -f -1 (นั่นคือลบหนึ่งไม่ใช่ลบลบ) กระบวนการ / bin / ls บนกล่อง RHEL ฉันใช้รูปแบบชื่อไฟล์ในคอลัมน์ด้วยเหตุผลบางอย่าง
Bruce Ediger

0

เพิ่มประสิทธิภาพการเพิ่มประสิทธิภาพใน coreutils 7.0 (กระทำ 8d974b00fbbcc2525de63e1e6d54827648fefa1c4):

2008-08-01  Kamil Dudka  <kdudka@redhat.com>
    ls -U1 now uses constant memory
    When printing one name per line and not sorting, ls now uses
    constant memory per directory, no matter how many files are in
    the directory.
    * ls.c (print_dir): Print each file name immediately, when possible.
    * NEWS: Mention the improvement.

คำอธิบายแรกที่นึกถึงคือคุณกำลังใช้ coreutils รุ่นเก่ากว่า คุณต้องอัพเกรด

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