Bash

如何將文件副檔名數字增加一

  • October 4, 2018

在以下目前文件夾下,我們有文件範例

lok.log.1
df.log.6
weq.log.90
vr.log.11
vs.aw.frsd.log.3

我們想將文件副檔名增加 1

所以預期的輸出將如下

lok.log.2
df.log.7
weq.log.91
vr.log.12
vs.aw.frsd.log.4

請建議如何使用查找和正則表達式重命名文件

  • 概念應該是所有具有“.log”的文件都將被+1重命名

zsh

autoload zmv # best in ~/.zshrc
zmv -n -f '(*.log.)(<->)(#qnOn)' '$1$(($2+1))'

-n(如果對結果滿意,去掉)

  • <->匹配任何十進制數
  • (#qnOn): glob 限定符在這裡按數字 ( n) 按名稱 ( On) 以相反的順序對文件列表進行排序, 因此file.log.2重命名為file.log.3beforefile.log.1重命名為file.log.2. .如果您只想重命名正常文件(但您可能希望添加一個假設-o-nTGNU 的選項mv)並且D您還想重命名隱藏文件,請添加。
  • -f禁用當文件重命名為現有文件時會取消該命令的保護措施,這會妨礙我們上面file.log.1file.log.2範例。它仍然會防範兩者並重foo.log.1命名foo.log.01foo.log.2.

遞歸:

zmv -n -f '(**/)(*.log.)(<->)(#qnOn)' '$1$2$(($3+1))'

bashshksh:

zsh << 'EOF'
autoload zmv
zmv -n -f '(*.log.)(<->)(#qnOn)' '$1$(($2+1))'
EOF

bash和沒有 using zsh,如果你有 GNUls和 GNU mv,並且文件列表不是太大,你可以做一些接近的事情:

shopt -s failglob
shopt -s extglob
export LC_ALL=C
eval "files=($(
 ls --quoting-style=shell-always -rvd -- *.log.+([[:digit:]])))"
for f in "${files[@]}"; do
  echo mv -nT -- "$f" "${f%.*}.$((10#${f##*.} + 1))"
done

echo(滿意時刪除)。

遞歸地,使用 GNU bash、 GNU find、 GNUmv和 GNU sort,僅用於正常文件:

export LC_ALL=C
while IFS= read -rd '' -u3 file; do
 echo mv -nT "$file" "${file%.*}.$((10#${file##*.} + 1))"
done 3< <(
 find . -name '.?*' -prune -o -regex '.*\.log\.[0-9]+' -type f -print0 |
   sort -rzV)

mv -n是一個 GNU 擴展,用於避免破壞現有文件,並-T消除移至移入之間的歧義,mv否則會受到影響。但是請注意,當文件由於 而未重命名時-n,您不會收到任何錯誤。

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