Linux
在文件夾內的目錄上應用計數器
我有一個這樣的文件夾結構:
drwxr-xr-x 2 root root 4096 Jun 30 21:34 dir_0.0.1_2 drwxr-xr-x 2 root root 4096 Jul 2 23:45 dir_0.0.1_1 -rw-r--r-- 1 root root 24 Jul 3 00:03 a.sh drwxr-xr-x 2 root root 4096 Jul 3 00:04 dir_0.0.1_3
一個名為 : 的新目錄由同一目錄上
dir_0.0.1
的腳本創建。a.sh
如何在我的腳本中應用計數器,以便將新形成的目錄重命名為dir_0.0.1_4
?
在 zsh 中:
set -- dir_0.0.1_*(oe['REPLY=${REPLY##*_}']n[-1]) mv dir_0.0.1 dir_0.0.1_$(( ${1##*_} + 1 ))
這將位置參數(僅
$1
在此處使用)設置為萬用字元的擴展dir_0.0.1_*(oe['REPLY=${REPLY##*_}']n[-1])
:
- 文件名必須以
dir_0.0.1_
- 然後使用隨後的表達式對文件名進行
o
排序(排序) ,其中e[ ... ]
- 將排序鍵設置為文件名的一部分,該部分是由於剝離盡可能多的前導字元直到最後的
_
下劃線而產生的n
按數字排序- 然後對文件名列表進行切片以返回最後一個元素 (
[-1]
)目前索引最大的文件名現在位於
$1
. 該數字在$(( ))
數字擴展中檢索(同樣,通過剝離前導字元_
),然後添加一個並添加靜態前綴。在 bash 中,我會遍歷文件名並手動比較索引:
# safe starting point greatest=-1 for d in dir_0.0.1_*; do n=${d##*_}; [ "$n" -gt "$greatest" ] && greatest=$n; done mv dir_0.0.1 dir_0.0.1_$(( greatest + 1))
bash 循環的分解(實際上是 sh 兼容的):
- 我們首先為索引設置一個可能安全的起點——這個起點肯定低於我們發現的任何起點
- 使用
for
帶有萬用字元的循環來獲取現有的目錄名稱;對於每個目錄:- 通過剝離從前面到最後一個下劃線的所有內容來擷取最後的索引
- 測試該指數,看它是否大於目前最高指數;如果是,則重置最高索引
- 循環完成後,通過附加“highest + 1”值重命名目錄
另一種選擇是暴力循環遍歷索引,直到找到未使用的索引:
# set this to something you know exists index=1 while [ -e dir_0.0.1_"${index}" ]; do index=$((index + 1)); done mv dir_0.0.1 dir_0.0.1_"${index}"
這會增加
$index
,直到相應命名的目錄不存在。然後,我們使用該未使用的號碼進行重命名。