![在 Unix 中以第二個字元開始對資料夾進行排序](https://rvso.com/image/168780/%E5%9C%A8%20Unix%20%E4%B8%AD%E4%BB%A5%E7%AC%AC%E4%BA%8C%E5%80%8B%E5%AD%97%E5%85%83%E9%96%8B%E5%A7%8B%E5%B0%8D%E8%B3%87%E6%96%99%E5%A4%BE%E9%80%B2%E8%A1%8C%E6%8E%92%E5%BA%8F.png)
我試圖透過從第二個字元開始對目錄列表進行排序。
例如,如果我執行下面的程式碼,目錄清單將根據第一個字元按順序排列。
$ 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上列印其參數r
aw1
C
*(qualifiers)
: 帶有 glob 限定符的 globN
:N
ullglob: 如果沒有符合則擴充為空/
:僅選擇文件類型目錄oe[expression]
:o
根據表達式的結果(在表達式運算後最初包含檔案名稱e
的值)對清單進行排序$REPLY
REPLY=${REPLY#?}
:去掉檔案名稱的第一個字元。
您可能還想在末尾添加第一個字符,例如REPLY=${REPLY#?}.$REPLY[1]
, asmith
,bsmith
按csmith
該順序排序而不是隨機排序。