1

Имея несколько файлов в каталоге data следующая команда ls дает удивительный результат в том смысле, как они упорядочены:

for f in data/*; do echo $f;  done


data/CitiesBaselineCounts2015010520150112.49.csv
data/CitiesBaselineCounts2015010520150112.4.csv
data/CitiesBaselineCounts2015010520150112.50.csv
data/CitiesBaselineCounts2015010520150112.5.csv
data/CitiesBaselineCounts2015010520150112.6.csv
data/CitiesBaselineCounts2015010520150112.7.csv
data/CitiesBaselineCounts2015010520150112.8.csv
data/CitiesBaselineCounts2015010520150112.9.csv
data/CitiesBaselineCounts2015010520150112.csv

. символ ascii 46-, который предшествует кодам для всех цифр (от 48 до 57).

Так что порядок не лексикографический. Каковы правила для сортировки , используемой командой ls

2 ответа2

2

Когда вы делаете for f in data/* перечисление имен файлов выполняется вашей оболочкой, а не "ls". Обычно оболочки будут сортироваться лексикографически (bash делает), но они могут использовать ваш порядок сортировки локали LCLCOATE. Возможно, ваша конкретная оболочка не сортируется вообще.

Записи в каталоге обычно не сортируются, но это зависит от базовой файловой системы. Используйте ls -f для вывода списка без сортировки.

Когда вы говорите ls * , сначала оболочка раскрывается * и может отсортировать результат, затем ls снова отсортирует имена файлов.

1

ls, sort и ваш скрипт имеют одинаковый порядок, лексикографический, основанный на значении ASCII каждой позиции, за исключением того, что не буквенно-цифровые значения игнорируются

а.
а ..
abc0
abc1
abc_1
abc.1
abc..1
abc.1.4
abc.1..4
abc.1.5
abc2
абв ~ 2
abc_2
ABC-2
abc.2
абв # 2
аЬс% 2
ABC3
abc4
abc4.1
abc4.2
abc49
abc_9
ABCA
ABCA
ЦКА

см. ответ на вопрос 631402 для более подробного обсуждения, включая отключение локали, которая дает лексикографическую сортировку по значению ASCII, включая символы

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .