Який сенс ls -f (або, чому це висить?)


9

У мене каталог з близько 100 000 файлів у ньому. ls -f висить більше хвилини. Я побіг стрибко, і одразу почав бачити гедейнди, тому ls чітко читає каталог. Я також бачу багато дзвінків до brk, тому ls явно буферизує речі в пам'яті. Я написав просту програму, яка викликає readdir і виводить імена файлів, і вона відповідає негайно. Але 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 ls не смоктала?

Відповіді:


7

Сенс -fполягає в тому, щоб спробувати уникнути необхідності статистати кожного запису файлу та уникати необхідності їх читання перед тим, як будь-який відображатиметься. Це "мета" варіант, який просто відключає інші параметри.

Отже, так, він повинен робити те, що ви очікуєте. Я не можу відповісти, чому це не так, але я б припустив, що у вас може бути псевдонім оболонки або щось інше, що вставляє в команду додаткові параметри. Це може повторно ввімкнути функцію, ніж -fвимкнено, і вважатиметься "більш конкретною", тому переважайте.


2
Argghh. ls () {/ bin / ls -FB $ @; } Тупі сценарії запуску.
Вільям Перселл

1
хм. Я вимикаю функцію, і я все ще бачу ту саму поведінку, навіть коли бігаю / bin / ls.
Вільям Перселл

Do / bin / ls -f -1 (це мінус-один, а не мінус-ell). / Bin / ls у вікні RHEL я чомусь використовую назви файлів форматів у стовпцях.
Брюс Едігер

0

Додано оптимізацію в coreutils 7.0 (commit 8d974b00fbbc2025de63e1e6d54827648fefa1c4):

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. Вам потрібно оновити.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.