Какой смысл в ls -f (или почему это зависание?)

9

У меня есть каталог с около 100 000 файлов в нем. ls -f зависает больше минуты. Я запустил strace и сразу начал встречаться с гетентами, поэтому ls четко читает каталог. Я также вижу много обращений к brk, поэтому ls явно буферизует вещи в памяти. Я написал простую программу, которая вызывает readdir и выводит имена файлов, и она отвечает немедленно. Но ls -f не обеспечивает вывод. Что дает? Я думал, что весь смысл -f в том, что он заставляет ls делать только чтение. Существует ли переносимый надежный способ составления списка содержимого каталога? (Обратите внимание, это ls из coreutils gnu в Linux.)

-РЕДАКТИРОВАТЬ-

Был псевдоним, но «/ 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 $ @; } Глупые скрипты запуска.
Уильям Перселл
1
хмм. Я отключил функцию и все еще вижу то же самое поведение, даже когда я запускаю / bin / ls.
Уильям Перселл
Сделайте / bin / ls -f -1 (это минус один, а не минус все). / Bin / ls в окне RHEL я почему-то использую форматы имен файлов в столбцах.
Брюс Эдигер
0

В coreutils 7.0 была добавлена ​​оптимизация (коммит 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. Вам нужно обновить.

Жиль "ТАК - перестань быть злым"
источник