Bash
如何將文件副檔名數字增加一
在以下目前文件夾下,我們有文件範例
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.3
beforefile.log.1
重命名為file.log.2
..
如果您只想重命名正常文件(但您可能希望添加一個假設-o-nT
GNU 的選項mv
)並且D
您還想重命名隱藏文件,請添加。-f
禁用當文件重命名為現有文件時會取消該命令的保護措施,這會妨礙我們上面file.log.1
的file.log.2
範例。它仍然會防範兩者並重foo.log.1
命名foo.log.01
為foo.log.2
.遞歸:
zmv -n -f '(**/)(*.log.)(<->)(#qnOn)' '$1$2$(($3+1))'
從
bash
或sh
或ksh
:zsh << 'EOF' autoload zmv zmv -n -f '(*.log.)(<->)(#qnOn)' '$1$(($2+1))' EOF
有
bash
和沒有 usingzsh
,如果你有 GNUls
和 GNUmv
,並且文件列表不是太大,你可以做一些接近的事情: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
、 GNUfind
、 GNUmv
和 GNUsort
,僅用於正常文件: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
,您不會收到任何錯誤。