Ls

是否有在換行符之前排序的字元,用於管理“ls”中的排序順序?

  • August 28, 2019

我正在製定一些文件命名指南,並試圖找到一種方法來允許在最終修訂之前列出草稿文件。

範例:目前我的命名約定如下所示:

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_draft01contract_foo_v001_release(或contract_foo_v001_final@Kusalananda 建議的;任何在 之後排序的詞draft),假設每個文件的版本不超過 999 個,每個版本的草稿不超過 99 個,那麼它們將按正確的順序排序ls單獨或任何按詞彙順序列出文件的工具。

另請參閱ls -rt按修改時間(最新最後)或 . 的Om全域限定符對文件進行排序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 之後的語言環境中,%它們都被忽略了。

因此,如果我們通過使用 0-padding 並使用-而不是 來修復 v2 與 v10 ~,通過擴展,我們會在人類語言環境和/語言環境中.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

引用自:https://unix.stackexchange.com/questions/537593