Mam kilka plików od log1
do log164
.
Próbuję LISTĘ katalog (posortowany) w terminalu UNIX, ale funkcje sortowania zapewniają tylko taki format:
home:logs Home$ ls -1 | sort
log1.gz
log10.gz
log100.gz
log101.gz
log102.gz
log103.gz
log104.gz
log105.gz
log106.gz
...etc
Chcę to
home:logs Home$ ls -1 | sort
log1.gz
log2.gz
log3.gz
log4.gz
log5.gz
log6.gz
log7.gz
...{more here}
log99.gz
log100.gz
log101.gz
log102.gz
...etc
Wszelkie sugestie dotyczące tego, czego mógłbym to zrobić?
log1.gz
przezlog164.gz
, a następnie co ty nawet trzebals -1
nimi?ls -1
robi: wyświetla nazwy plików. Ponieważ znasz już nazwy plików, nie rozumiem, do czego go potrzebujesz. Ale skoro zaakceptowałeś odpowiedź Kevina, teraz wiem: nie potrzebujesz jej. Co ma sens. :-)Odpowiedzi:
bash
nawiasy klamrowe{}
wyliczą je w kolejności:źródło
Dlaczego nie skorzystać z wbudowanej
ls
funkcji w tym konkretnym przypadku, a mianowicie-v natural sort of (version) numbers within text
Na przykład
ls -1v log*
źródło
sort
na wypadek, gdyby ktoś miał tablicę ciągów zamiast katalogu plików-v - Force unedited printing of non-graphic characters
.ls | sort -n
Z GNU ls (tj. W Linuksie, Cygwin lub innych systemach, w których GNU jest specjalnie zainstalowany):
W Zsh:
W innych muszlach:
Zastąp
echo
,printf '%s\n'
jeśli chcesz, aby każda nazwa pliku znajdowała się w osobnej linii.Jeśli chcesz także metadanych pliku (
ls -l
) i nie masz GNU ls, musisz wywoływaćls
osobno dla każdej nazwy pliku lub grupy nazw plików, które chcesz zobaczyć w porządku leksykograficznym.Aby uniknąć tych trudności, używaj wystarczającej liczby zer wiodących w nazwach plików, aby sortowanie leksykograficzne było przyjazne dla człowieka (
log001.gz
itp.).źródło
Chociaż rozwiązanie
ls -1v
jest z pewnością najładniejsze w tym konkretnym przypadku, myślę, że dobrze jest mieć takie, które działasort
tak jak w pierwotnym pytaniu, ponieważ działa to również wtedy, gdy twój wkład nie pochodzils
. W takim przypadku możesz użyć:Ta
-n
opcja nakazuje sortowaniu sortowanie numeryczne i-k 1.4
ustawia klucz sortowania na pierwsze pole (w tym przypadku jest to cała nazwa pliku), zaczynając od czwartego znaku do ostatniego.źródło
ls -1 | sort -n -k1.4
nie działa. Daje nieposortowane początkowo do 4 znaków, a następnie posortowane po 4 znaku. Użyłemls -1 |sort | sort -n -k1.4
zamiast tego i działało idealnie.sort -k1.1,1.3 -k1.4n
.sort
implementacje nie muszą być stabilne, więc twoje podejście nie będzie działać ze wszystkimi implementacjami. Zobacz także-V
opcję GNU i FreeBSDsort
.GNU
sort
(dostępny w Linuksie) ma tryb „sortowania wersji”, który interpretuje liczby w liczbach innych niż liczby tak, jak prosisz:Od
man 1 sort
:(Tworzenie pustych plików testowych do wyświetlenia
touch log1.gz log2.gz log3.gz log99.gz log100.gz log101.gz log102.gz
:)Twój przykładowy przypadek, dodając
-V
opcję (lub--version-sort
):źródło
jeśli używasz komputera Mac lub BSD, spróbuj tego:
źródło
Moja wersja Solaris nie obsługuje
ls -v
(grrr). A rozwiązanie sortowania podane powyżej 1) wymaga znajomości pozycji cyfr w nazwie pliku, a 2) nie obsługuje takich rzeczy, jak wieloczęściowe numery wersji.Poniższe podejście jest kompatybilne z Solaris, nie wymaga wcześniejszej znajomości pozycji cyfr i obsługuje numery wersji z 2, 3 lub 4 komponentami (jak: a-1.2, foo-5.6.7, bar_baz_9.10.11.12). Służy również
sort -f
do składania razem wielkich i małych liter i odpowiednio obsługuje katalogi zmiatane z plikami:ls -d | sort -f -t . -k 1,1 -k 2,2n -k 3,3n -k 4,4n
Pamiętaj, że ta wersja ogranicza pierwszy składnik do jednej cyfry.
Jeśli Twój docelowy system operacyjny obsługuje
ls -v
, jest to zdecydowanie najlepsze rozwiązanie.źródło
Rozwiązanie Perla:
źródło
źródło
-t .
jest zbyteczne.To zadziałało dla mnie.
Mam pliki 1.jpg 2.jpg ... 18.jpg
$ echo *.jpg | tr -s ' ' '\n' | sort -n
sort
jest mylony zls
wydrukiem z powodu niezadrukowanych kolorowych znaków. Jeśli spróbujesz:ls -1 --color=none *.jpg | sort -n
będzie działać idealnie.
sort
może zignorować niedrukowalne znaki z-i
opcją, ale nadal nie działa i nie wiem dlaczego.Ale zawsze możesz usunąć taki kolor i
sort
zadziała:ls -1 --color=always *.jpg | sed -r "s/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[mGK]//g" | sort -n
Mam nadzieję, że pewnego dnia
sort
będzie na to dostępna opcja.źródło