如何将文件扩展名以数字方式增加一

yae*_*ael 2 bash find shell-script rename

在以下当前文件夹下,我们有文件示例

lok.log.1
df.log.6
weq.log.90
vr.log.11
vs.aw.frsd.log.3
Run Code Online (Sandbox Code Playgroud)

我们想将文件扩展名增加 1

所以预期的输出将如下

lok.log.2
df.log.7
weq.log.91
vr.log.12
vs.aw.frsd.log.4
Run Code Online (Sandbox Code Playgroud)

请建议如何使用查找和正则表达式重命名文件

  • 这个概念应该是所有具有“.log”的文件都将被+1重命名

Sté*_*las 5

zsh

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

(删除-n如果对结果满意)

  • <-> 匹配任何十进制数
  • (#qnOn): glob 限定符在这里按数字 ( n) 按名称 ( On)以相反的顺序对文件列表进行排序,因此file.log.2重命名为file.log.3之前file.log.1重命名为file.log.2. 添加.如果要重命名只是普通的文件(但你可能会想添加一个-o-nT选项假设GNU mv)和D,如果你也想重命名文件隐藏。
  • -f禁止将取消命令时,文件将被重命名为现有的文件,该文件将得到我们的方式的保障file.log.1file.log.2例如上面。它仍然将防范都foo.log.1foo.log.01被重命名为foo.log.2

递归地:

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

bashshksh

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

使用bash和不使用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
Run Code Online (Sandbox Code Playgroud)

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)
Run Code Online (Sandbox Code Playgroud)

mv -n是一个 GNU 扩展,以避免破坏现有文件,并-T消除移动到移动之间的歧义,mv否则会受到影响。但是请注意,当文件因 未重命名时-n,您不会收到任何关于此的错误。