是否有在換行符之前排序的字元,用於管理“ls”中的排序順序?
我正在製定一些文件命名指南,並試圖找到一種方法來允許在最終修訂之前列出草稿文件。
範例:目前我的命名約定如下所示:
contract_foo_v1 contract_foo_v1~draft1 contract_foo_v1~draft2 contract_foo_v2 contract_foo_v2~draft1
問題是 v1~draft 應該在v1(最終修訂版)之前列出。有沒有我可以使用的字元,如下所示:
contract_foo_v1?draft1 contract_foo_v1?draft2 contract_foo_v1 contract_foo_v2?draft1 contract_foo_v2
我也了解可能存在語言環境和程序差異,因此我正在尋求在大多數情況下(或盡可能多的情況下)可以按要求工作的角色的建議 - 感謝您的幫助
ls
根據文件名稱對文件列表進行排序,在您的情況下不包含換行符。甚至對不包含換行符的行的內容sort
進行排序,所以這裡不是要找到一個在 newline 之前排序的字元,而是一個在什麼都沒有排序之前的字元,你不會找到一個。現在,GNU
ls -v
(用於版本排序)確實會按照您想要的順序對該文件列表進行排序:$ ls -v1 contract_foo_v1~draft1 contract_foo_v1~draft2 contract_foo_v1 contract_foo_v2~draft1 contract_foo_v2 contract_foo_v10
如果沒有
-v
, sincels
進行詞法排序,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
, shell,您可以定義一個全域排序順序,例如: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
全域限定符對文件進行排序zsh
。現在,如果您為這些文件名添加副檔名(如
$ 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 之後的語言環境中,%
它們都被忽略了。因此,如果我們通過使用 0-padding 並使用
-
而不是 來修復 v2 與 v10~
,通過擴展,我們會在人類語言環境和/語言環境中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