Есть ли символ, который сортируется перед символом новой строки, для управления порядком сортировки в 'ls'?

Вы правы; сообщение #124 неверно.

Есть проблема, что люди иногда пишут единицыWantedBy=sleep.targetAfter=sleep.target. Это запустит устройство перед сном, а затем не будет ждать, пока они закончат работу, прежде чем заснуть, что почти наверняка не то, что они пытались сделать. Возможно, это то, о чем думал плакат.

Авторитет :Я самостоятельно написал подобный модуль для запуска hdparm при возобновлении работы, основываясь на аналогичном анализе. Работает нормально, как и говорится в ответе post #129 . Мой блок работает правильно каждый раз. Я знаю, потому что если я запускаю без , я слышу щелчки с моего жесткого диска. Ранее мне удалось выявить ошибку в udev , которая делала мое предыдущее решение ненадежным исключительно потому, что я слышал щелчки.

2
27.08.2019, 16:59
1 ответ

lsсортирует список файлов по имени, которое в вашем случае не содержит символов новой строки. Даже sortсортирует по содержимому строк, которые не включают символ новой строки, поэтому здесь речь идет не о поиске символа, который сортирует перед новой строкой , а тот, который сортирует до ничего и не найдешь.

Так вот, GNUls -v(для версии -sort )действительно сортирует этот список файлов в нужном вам порядке:

$ ls -v1
contract_foo_v1~draft1
contract_foo_v1~draft2
contract_foo_v1
contract_foo_v2~draft1
contract_foo_v2
contract_foo_v10

Без -v, поскольку lsвыполняет лексическую сортировку, v10также будет сортировать до v2.

В GNU sortвы также можете использовать sort -Vв выводе ls(, предполагая, что ваши имена файлов не содержат символов новой строки):

$ ls | sort -V
contract_foo_v1~draft1
contract_foo_v1~draft2
contract_foo_v1
contract_foo_v2~draft1
contract_foo_v2
contract_foo_v10

POSIXly вы могли бы сделать:

$ ls | sort -t'~' -k1.15,1n -k2,2.1r -k2n
contract_foo_v1~draft1
contract_foo_v1~draft2
contract_foo_v1
contract_foo_v2~draft1
contract_foo_v2
contract_foo_v10

Но это предполагает, что часть перед версией всегда имеет длину 14 символов.

В оболочке zshвы можете определить порядок сортировки глобусов, например:

drafts_first() {
  [[ $REPLY = *'~draft'* ]] || REPLY="$REPLY~release"
}
printf '%s\n' *(no+drafts_first)

Вы также можете назвать свои файлы, например, contract_foo_v001_draft01иcontract_foo_v001_release(или contract_foo_v001_final, как предложил @Kusalananda; любое слово, которое сортируется после draft), при условии, что у вас никогда не будет более 999 версий на документ и 99 черновиков на версию, тогда они будут сортироваться в правильном порядке с помощью одного lsили любого инструмента, который перечисляет файлы в лексическом порядке.

См. также ls -rtдля сортировки файлов по времени модификации (последним последним )или Omквалификатору glob для zsh.

Теперь, если вы добавите расширение (, например .pdf), к этим именам файлов, тогда все станет совсем другим:

$ LC_ALL=en_US.UTF-8 ls -1
contract_foo_v10.pdf
contract_foo_v1~draft1.pdf
contract_foo_v1~draft2.pdf
contract_foo_v1.pdf
contract_foo_v2~draft1.pdf
contract_foo_v2.pdf
$ LC_ALL=C ls -1
contract_foo_v1.pdf
contract_foo_v10.pdf
contract_foo_v1~draft1.pdf
contract_foo_v1~draft2.pdf
contract_foo_v2.pdf
contract_foo_v2~draft1.pdf

В моей локали en_US.UTF-8и ~, и .игнорируются при первом проходе сравнения,поэтому v10предшествует v1~d, потому что 0сортируется до d, а v1~draftпредшествует v1.pdf, потому что draftсортируется до pdf(, что было бы иначе с расширением .docx).

В локали C, где есть только один проход и сортировка основана на значении байта, ., 0и ~сортируются в этом порядке. ~— это печатный символ с наивысшим значением в ASCII, так что это будет худший выбор. Есть довольно много, которые предшествуют ., такие как #, -, %, все они игнорируются в первом проходе выше в локалях, следующих за iso14651 _t1.

Таким образом, если мы исправим v2 и v10, используя 0 -заполнение и используя -вместо ~, с расширениями .pdfмы получим желаемый порядок как в человеческих локалях и в локалях C/ C.UTF-8, где порядок основан на кодовой точке:

$ LC_ALL=en_US.UTF-8 ls -1
contract_foo_v01-draft1.pdf
contract_foo_v01-draft2.pdf
contract_foo_v01.pdf
contract_foo_v02-draft1.pdf
contract_foo_v02.pdf
contract_foo_v10.pdf
$ LC_ALL=C ls -1
contract_foo_v01-draft1.pdf
contract_foo_v01-draft2.pdf
contract_foo_v01.pdf
contract_foo_v02-draft1.pdf
contract_foo_v02.pdf
contract_foo_v10.pdf
4
27.01.2020, 21:58

Теги

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