在 Unix 中以第二個字元開始對資料夾進行排序

在 Unix 中以第二個字元開始對資料夾進行排序

我試圖透過從第二個字元開始對目錄列表進行排序。

例如,如果我執行下面的程式碼,目錄清單將根據第一個字元按順序排列。

$ ls -1d */
lrodriguez/
mreynolds/
yalberto/

我想要完成的是將它們顯示為:

yalberto/
mreynolds/
lrodriguez/

我查看了以下論壇: 如何按檔案名稱的一部分對檔案進行排序? 但沒有成功。

我嘗試過類似的事情:ls -1d -- *?[a-z]* | sort -t?[a-z] -k2但沒有得到任何結果。對於 Unix 環境來說還很陌生,任何指示都會非常有幫助。先感謝您。

答案1

透過sort,您可以使用表單的鍵F.C來指定字元位置之內一個字段。例如

$ printf '%s\n' */ | sort -k1.2
yalberto/
mreynolds/
lrodriguez/

請注意,如果任何目錄名稱包含換行符,此操作將會失敗。

這可以透過 GNU 來解決,sort方法是使用 NUL 分隔的記錄,而不是:

printf '%s\0' */ | sort -zk1.2 | tr '\0' '\n'

另請注意, 的擴充功能*/還包括目錄的符號連結。

答案2

zsh

print -rC1 -- *(N/oe['REPLY=${REPLY#?}'])
  • print -rC1在olumn上列印其參數raw1 C
  • *(qualifiers): 帶有 glob 限定符的 glob
  • N: Nullglob: 如果沒有符合則擴充為空
  • /:僅選擇文件類型目錄
  • oe[expression]o根據表達式的結果(在表達式運算後最初包含檔案名稱e的值)對清單進行排序$REPLY
  • REPLY=${REPLY#?}:去掉檔案名稱的第一個字元。

您可能還想在末尾添加第一個字符,例如REPLY=${REPLY#?}.$REPLY[1], asmith,bsmithcsmith該順序排序而不是隨機排序。

相關內容