Bash ls неправильно сортирует?

sh -v <<< 'pytest /awesome_tests -k test_quick_tests -n auto' \
    &> test_output_$(date -u +"%FT%H%MZ").txt

sh -vприводит к тому, что shотображает каждую командную строку в stderr, поэтому, поскольку вы уже записываете stderrв выходной файл, все, что необходимо, — это использовать параметр -vи предоставить shс командой, которую вы хотите запустить.

Обратите внимание, что в моем тестировании sh -v -c 'your-command-here'не работал.

echo 'pytest /awesome_tests -k test_quick_tests -n auto' | \
    sh -v &> test_output_$(date -u +"%FT%H%MZ").txt

работает, но echo... |— это то, для чего предназначен bash<<<.

-1
19.09.2021, 23:08
1 ответ

Потому что lsпо умолчанию сортирует лексикографически.

Вы можете попробовать одно из двух:

№1:

ls -v

это будет рассматривать числа как номера версий, и это обычно решает подобные проблемы.

№2 (как описано здесь):

ls *{1..73}*pdf

ls -vможно заменить aliasпросто на ls, чтобы сделать это поведением по умолчанию. Расширение скобок bash будет перечислять по порядку, но я бы не рекомендовал его, так как он требует кучу служебной информации, например, максимальное число и т. д.

Если вам нужна еще более качественная сортировка, я бы предложил передать lsв sortи точно -настроить поведение сортировки таким образом.

По лексикографическому весу эта сортировка действительна:

a1
a10
a100
a2
a200
b1
b10
b100
b2
b20
...

Однако, если вы думаете об этом в более хронологическом смысле, он ищет во всем мире аналогичную нумерацию версий, поэтому ls -vчасто заботится об этом.

2
20.09.2021, 00:40

Теги

Похожие вопросы