To pytanie został poproszony przez pytania o ls
" -1
opcji i powtarzanego skłonności ludzi do zadawania pytań i odpowiedzi, które obejmuje przetwarzanie danych wyjściowych ls
.
Ponowne wykorzystanie danych wyjściowych ls
wydaje się zrozumiałe, np .: jeśli wiesz, jak posortować listę plików, ls
możesz użyć danych wyjściowych w ten sposób jako danych wejściowych do czegoś innego.
Jeśli te pytania i odpowiedzi nie zawierają odniesienia do utworzonej listy nazw plików składającej się z ładnie zachowujących się nazw plików (bez znaków specjalnych, takich jak spacje i znaki nowej linii), często komentuje je ktoś, kto wskazuje na niebezpieczeństwo, że sekwencja poleceń nie będzie działać to pliki z nowymi liniami, spacjami itp.
find
, sort
a inne narzędzia rozwiązują problem przekazywania „trudnych” nazw plików np. xargs
poprzez użycie opcji oddzielania nazw plików znakiem / bajtem NUL, który nie jest prawidłowym znakiem w nazwie pliku (jedyny oprócz /
?) na Systemy plików Unix / Linux.
Szukałem strony podręcznika użytkownika dla ls
i danych wyjściowych dla ls --help
(który zawiera więcej opcji na liście) i nie mogłem znaleźć, że ls
(od coreutils
) ma opcję określania danych wyjściowych oddzielonych od NUL. Ma -1
opcję, którą można interpretować jako „nazwy plików wyjściowych oddzielone znakiem nowej linii” )
P : Czy istnieje techniczny lub filozoficzny powód, dla którego ls
nie ma opcji --zero
lub -0
, która „wyprowadzałaby nazwy plików rozdzielone przez NUL”?
Jeśli zrobisz coś, co wyświetla tylko nazwy plików (a nie używasz np. -l
), Może to mieć sens:
ls -rt -0 | xargs -r0 …
Mogłem przegapić coś, dlaczego to nie zadziałało, lub czy istnieje alternatywa dla tego przykładu, którą przeoczyłem i która nie jest o wiele bardziej skomplikowana i / lub niejasna .
Uzupełnienie:
Robienie tego ls -lrt -0
prawdopodobnie nie ma większego sensu, ale w ten sam sposób, w jaki find . -ls -print0
nie, dlatego nie jest to powód, aby nie udostępniać opcji -0
/ -z
/ --zero
.
źródło
ls -rtz
na pewno by się przydał. Porównaj alternatywę: superuser.com/a/294164/21402Odpowiedzi:
AKTUALIZACJA (02.02.2014)
Dzięki naszej determinacji @ Anthon w śledzeniu braku tej funkcji , mamy nieco bardziej formalny powód, dla którego brakuje tej funkcji, co przypomina to, co wyjaśniłem wcześniej:
Moja oryginalna odpowiedź
To trochę moja osobista opinia, ale uważam, że decyzja o rezygnacji z tej opcji jest decyzją projektową
ls
. Jeśli zauważysz, żefind
polecenie ma ten przełącznik:Rezygnując z tego przełącznika, projektanci sugerowali, że nie powinieneś wykorzystywać
ls
produkcji do celów innych niż spożycie przez ludzi. Do dalszego przetwarzania przez inne narzędzia powinieneś użyćfind
zamiast tego.Sposoby użycia find
Jeśli szukasz tylko alternatywnych metod, możesz je tutaj znaleźć, zatytułowane: Robienie tego poprawnie: Szybkie podsumowanie . Z tego łącza są to prawdopodobnie 3 bardziej powszechne wzorce:
(niestandardowe rozszerzenia wspólne --print0 i -0. Działa na GNU, * BSD, busybox)
Dalsze dowody?
Znalazłem ten post z bloga na blogu Joeya Hessa zatytułowany: „ ls: brakujące opcje ”. Jeden z interesujących komentarzy w tym poście:
Podczas dalszych poszukiwań znalazłem to w dziennikach zatwierdzania jednego z dodatkowych przełączników, o których wspomina post na blogu Joeya, „ nowy format wyjściowy -j ”, więc wydaje się, że post na blogu wyśmiewał się na myśl o dodaniu
-z
przełącznikals
.Referencje
źródło
-0
w swoim pytaniu odniesienia do tego, dlaczego nie (przynajmniej nie do momentu wdrożenia), aby nie zmylić ludzi.ls -1 | tr '\012' '\000'
wyświetli listę plików oddzielonych znakami NULL.Ponieważ odpowiedzi @ slm sięgają początków i możliwych powodów, nie powtórzę tego tutaj. Takiej opcji nie ma na liście odrzuconych coreutils , ale poniższa łatka jest teraz odrzucana przez Pádraiga Brady'ego po wysłaniu jej na listę mailingową coreutils. Z odpowiedzi jasno wynika, że jest to powód filozoficzny (
ls
produkcja przeznaczona jest do spożycia przez ludzi).Jeśli chcesz wypróbować, czy taka opcja jest dla Ciebie uzasadniona, wykonaj:
następnie zastosuj następującą łatkę przeciwko zatwierdzeniu b938b6e289ef78815935ffa705673a6a8b2ee98e dd 29.01.2014:
Po kolejnej wersji możesz to przetestować za pomocą:
Tak więc łatka działa i nie widzę powodu, dla którego by nie działała, ale to nie jest dowód, że nie ma technicznego powodu, aby pominąć tę opcję.
ls -R0
może nie mieć większego sensu, ale nie robi tego,ls -Rm
cols
można zrobić po wyjęciu z pudełka.źródło
-z
i--zero
jest bardziej zgodne z sortowaniem (także w coreutils.