Jaki jest sens ls -f (lub dlaczego tak się zawiesiło?)

9

Mam katalog z około 100 000 plików. ls -f zawiesza się przez ponad minutę. Uruchomiłem strace i natychmiast zacząłem widzieć getdents, więc ls wyraźnie czyta katalog. Widzę również wiele wywołań do brk, więc ls wyraźnie buforuje rzeczy w pamięci. Napisałem prosty program, który wywołuje readdir i wyświetla nazwy plików, i odpowiada natychmiast. Ale ls -f nie dostarcza danych wyjściowych. Co daje? Myślałem, że chodzi o to, że powoduje, że ls nie robi nic więcej niż readdir. Czy istnieje przenośny i niezawodny sposób wyświetlania zawartości katalogu? (Zauważ, że pochodzi z coreutils GNU w Linuksie.)

-EDYTOWAĆ-

Wprowadzono alias, ale „/ bin / ls -1f> / dev / null” zajmuje od 8 do 15 sekund, „/ bin / ls -1fx> / dev / null” zajmuje od 4 do 11 sekund, ale prosty program to tylko readdir zajmuje 0,011 sekundy. Co muszę zrobić, aby GNU nie ssały?

William Pursell
źródło

Odpowiedzi:

7

Chodzi o -fto, aby uniknąć konieczności statycznego wpisywania każdego wpisu pliku i unikać konieczności czytania ich wszystkich, zanim zostaną wyświetlone. Jest to opcja „meta”, która po prostu wyłącza inne opcje.

Tak, powinien zrobić to, czego oczekujesz. Nie mogę odpowiedzieć, dlaczego tak nie jest, ale domyślam się, że możesz mieć alias powłoki lub coś innego, co wstawia dodatkowe opcje do polecenia. To może -fwłączyć ponownie funkcję niż wyłącza i można ją uznać za „bardziej szczegółową”, więc należy mieć pierwszeństwo.

Daniel Pittman
źródło
2
Argghh. ls () {/ bin / ls -FB $ @; } Głupie skrypty startowe.
William Pursell
1
hmm Wyłączam tę funkcję i nadal widzę to samo zachowanie, nawet jeśli uruchamiam / bin / ls.
William Pursell
Do / bin / ls -f -1 (to minus-jeden, a nie minus-ell). Plik / bin / ls w polu RHEL Z jakiegoś powodu używam formatowania nazw plików w kolumnach.
Bruce Ediger
0

Dodano optymalizację w coreutils 7.0 (commit 8d974b00fbbc2025de63e1e6d54827648fefa1c4):

2008-08-01  Kamil Dudka  <[email protected]>
    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.

Pierwszym wyjaśnieniem, które przychodzi mi na myśl, jest to, że używasz starszej wersji coreutils. Musisz zaktualizować.

Gilles „SO- przestań być zły”
źródło