Czy bash * pasuje do plików w kolejności alfanumerycznej?

25

Chcę połączyć kilka plików razem w kolejności nazw plików.

Czy można bezpiecznie założyć, że otrzymam je w kolejności alfanumerycznej?

cat * 

tj. ta sama kolejność, która lsdaje.

stamtąd
źródło

Odpowiedzi:

26

Krótka odpowiedź: Tak.

Ze strony podręcznika użytkownika bash :

Po podziale słów, chyba że ustawiono opcję -f (zobacz Wbudowany zestaw), Bash skanuje każde słowo pod kątem znaków „*”, „?” I „[”. Jeśli pojawi się jeden z tych znaków, to słowo jest traktowane jako wzór i zastępowane alfabetycznie uporządkowaną listą nazw plików pasujących do wzorca.

BloodPhilia
źródło
6
Pamiętaj, że „alfabetyczny” różni się w zależności od ustawień regionalnych (w szczególności $LC_COLLATE).
grawity
4
@grawity prawda, ale spowodowałoby to takie same wyniki jak lsw tym samym systemie.
BloodPhilia
8

Krótka odpowiedź brzmi tak, ale musisz zdawać sobie sprawę z tego, co według niego powinien być porządek alfanumeryczny, ponieważ może nie odpowiadać porządkowi naturalnemu, o którym myślisz.

Na przykład uruchom test sprawdzający, jak obsługiwane są wielkie i małe litery, aby dowiedzieć się w systemie, a także sekwencje liczb.

Częstym problemem, na jaki natknąłem się podczas porządkowania list plików zwracanych przez glob, są pliki numerowane. Często dostaję pliki o numerach takich jak:

blah_1.txt
blah_2.txt
...
blah_10.txt
blah_11.txt

Jednak glob używający *nie zwróci ich w tej kolejności, zamiast tego otrzymasz coś takiego:

blah_1.txt
blah_10.txt
blah_11.txt
...
blah_2.txt
blah_20.txt
...

Tak - aby uniknąć tego problemu będziesz albo trzeba zrobić jakąś manipulację na zwróconej listy plików lub plików przemianowania tak że jednocyfrowych mają zero (tj blah_01.txt, blah_02.txtitp).

dtlussier
źródło