Linux

在文件夾內的目錄上應用計數器

  • July 3, 2019

我有一個這樣的文件夾結構:

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,直到相應命名的目錄不存在。然後,我們使用該未使用的號碼進行重命名。

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