Вы правы; сообщение #124 неверно.
Есть проблема, что люди иногда пишут единицыWantedBy=sleep.target
After=sleep.target
. Это запустит устройство перед сном, а затем не будет ждать, пока они закончат работу, прежде чем заснуть, что почти наверняка не то, что они пытались сделать. Возможно, это то, о чем думал плакат.
Авторитет :Я самостоятельно написал подобный модуль для запуска hdparm при возобновлении работы, основываясь на аналогичном анализе. Работает нормально, как и говорится в ответе post #129 . Мой блок работает правильно каждый раз. Я знаю, потому что если я запускаю без , я слышу щелчки с моего жесткого диска. Ранее мне удалось выявить ошибку в udev , которая делала мое предыдущее решение ненадежным исключительно потому, что я слышал щелчки.
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