Czy możliwe jest wyjście find … -exec ls -ls ;
posortowane alfabetycznie według nazwy pliku?
To jest moje polecenie crona:
find /home/setefgge/public_html -type f -ctime -1 -exec ls -ls {} \;
To polecenie działa w większości dobrze. Ale wyniki nie są sortowane w żadnej znaczącej kolejności. Byłoby bardzo pomocne, gdyby zostały posortowane według pola nazwy pliku.
ls -ls **/*(.)
ls
posortuje.Odpowiedzi:
Zakładam, że twoje nazwy plików nie zawierają nowych linii.
Użycie
+
zamiast;
do zakończenia-exec
akcji powoduje, że jest szybsza poprzez grupowanie wywołańls
. Możesz sortować, przesyłając przezsort
polecenie; każ mu rozpocząć sortowanie od 10. pola (pierwsze 9 to metadane: bloki, uprawnienia, liczba linków, użytkownik, grupa, rozmiar i 3 pola daty / godziny). Ta opcja-n
mówils
o użyciu wartości liczbowych dla użytkownika i grupy, co pozwala uniknąć ryzyka, że nazwy użytkownika lub grupy zawierają spacje.Alternatywnie, zsh, możesz uciec bez żadnego założenia przy użyciu jakiejkolwiek nazwy, używając kwalifikatorów glob do gromadzenia i sortowania plików oraz
zargs
uruchamianials
wielu razy, jeśli linia poleceń byłaby zbyt długa. Potrzebujesz GNUls
(konkretnie jego-f
opcji), aby uniknąć ponownego sortowania wedługls
(innym podejściem byłoby emulowanie zals
pomocą Zshzstat
).źródło
Dlaczego nie potokować wyniku wyszukiwania przez sort, a następnie wykonać ls dla każdej linii?
źródło
POSIX ma do powiedzenia na temat dat na
ls
-l
liście ong:Biorąc to pod uwagę i upewniając się, że jeśli w nazwie pliku znajdują się nowe wiersze, są one odpowiednio globowane za pomocą również
ls -q
opcji określonej w POSIX , stosunkowo łatwo jest przygotować wyrażenie regularne dlals
wyniku bezfind
:grep
w tym celu zwracane będą tylko wiersze zawierające ciągi reprezentujące dzisiejsze lub wczorajsze daty. Następujące polecenie trochę to dodaje:ls
opcje składają się z:-a
zwróć wszystkie pliki w katalogu - w tym te, które zaczynają się na.dot
-l
długa lista-R
rekurencyjnie wypisz wszystkie katalogi potomne-c
wyświetla czas modyfikacji, a nie czas dostępu-q
zwraca nazwę globu powłoki?
zamiast\t
znaków niedrukowalnych lub znaków ab w nazwie plikuWyniki są przekazywane do
|pipe
pliku, dosed
którego pasuje tylko:-
(innymi słowy - nied
dla katalogu), które również zawierają twójdate
.Dane wyjściowe wyglądają następująco:
Tak, to nawet działa z
LS_COLORS
- co jest prawdopodobnie niskim priorytetem dla ciebiecron
, ale, hej, twoje opcje są otwarte.W każdym razie oferuje to pewne znaczące zalety w porównaniu z innymi możliwymi rozwiązaniami.
Po pierwsze
find
+ls
obejmuje wiele wywołań - dotyczy to tylko jednegols
procesu i dlatego jest w stanie niezawodnie sortować wszystko - co robi domyślnie - i dlategosort
jest również pomocniczy.Każde rozwiązanie obejmujące
find
asort
ils
jest dość dużo robi wszystko z pracy dwa razy.ls
ifind
rozpozna każdą ścieżkę istat
każdy plik.ls
isort
oba posortują wszystkie wyniki. Prawdopodobnie najlepiej jest po prostu użyć singlals
.Potem oczywiście są
date
ised
części tej odpowiedzi. Ważną rzeczą do zapamiętania jest to, że wykonujesz trudną część i najpierw otrzymujesz wyrażenie regularne - i tylko raz - a następnie przycinasz tylko jedną listę wyników, zamiast mówić, uzyskiwać wyniki, uzyskiwać wyniki, sortować wyniki i sortować wyniki.Nie wpływa to na nazwy plików zawierające znaki nowej linii, podobnie jak inne rozwiązania. To rozwiązanie ma swoje własne zastrzeżenia - które wyjaśnię dalej - ale są niewielkie i łatwe do rozwiązania. Moim zdaniem jest to najbardziej niezawodne rozwiązanie tutaj.
Istnieją dwa przypadki, w których powyższe polecenie może powodować problemy. Pierwszy dotyczy
?
globów w nazwach plików - chociaż jest to już bardziej niezawodne rozwiązanie niż jakiekolwiek inne oferowane tutaj, a prawdopodobieństwo, że się?
w ogóle natkniesz, jest wystarczająco małe samo w sobie, istnieje możliwość rozwiązania tych globów może pasować do więcej niż jednej nazwy pliku. Zobacz to, aby uzyskać więcej informacji na ten temat.Inna możliwość wiąże się z fałszywym pozytywem - na przykład jeśli masz nazwę pliku faktycznie pasującą do
date
ciągu, którego szukamy,grep
ale nie została ona faktycznie zmodyfikowana w żadnym z tych dni. Nie liczę na to, że jest to problem, ale jeśli tak, zapytaj o to i prawdopodobnie pomogę ci sprecyzować wyrażenie regularne, aby sobie z tym poradzić.źródło
Możesz użyć kombinacji find, xargs i ls.
Oto przykładowe polecenie:
find . -type f -print0 | xargs -0 ls -lt
find
będzie rekurencyjnie szukał wszystkich plików w bieżącym katalogu.ls
polecenia w jednym wywołaniu (pod warunkiem, żefind
zwraca mniej niżARG_MAX
pliki).ls -lt
posortuje te pliki według czasu i sformatuje dane wyjścioweAby odzyskać system
ARG_MAX
, możesz wpisać:źródło
źródło
ls
dokonuje własnego sortowania, więcfind
przepuszczanie danych wyjściowych przezsort
przelot jest bezużyteczne. Ponadto twoje polecenie zmienia nazwy plików zawierające spacje (między innymi) i zakończy się niepowodzeniem, jeśli będzie zbyt wiele nazw plików.