如何使用 bash 批量重命名文件

如何使用 bash 批量重命名文件

我知道有很多这样的问题,但我找不到一个(或几个的组合)来描述我想要做的事情。我想我需要使用正则表达式,但我不太擅长。我使用 zsh。我有一个包含文件的文件夹,我想重命名它:

  • 我想要将文件challenge1.rb、、challenge2.rbchallenge3.rb重命名为c1.rbc2.rb等。同样task1.rb,和 similar 也必须重命名为t1.rbetc。

  • sample_spec_c1.rbsample_spec_c2.rb必须重命名为等c1_spec.rbc2_spec.rb

所以我想我需要正则表达式和迭代的某种组合,但我不知道如何编写 bash 脚本。

答案1

这是一个简短的脚本,可以完成您想要的操作。您可以使用以下文件列表调用该脚本:./scriptname *.rb或使用目录(它将递归它们):./scriptname .

不要忘记设置可执行位:chmod a+x scriptname

#!/bin/sh

suff=rb     # suffix of files to rename

script="$0" # this script name for recursion

for f in "$@" ; do
    if test -d "$f" ; then
        echo "=== recursing directory $f"
        find "$f" -type f -name "*.$suff" -exec "$script" {} +
    elif test -f "$f" ; then
        d="$(dirname "$f")"
        b="$(basename "$f")"
        r="$(echo "$b" | sed -r "s/^([a-zA-Z])[a-zA-Z]*([0-9]+\.${suff})\$/\1\2/;s/^[a-zA-Z]+_([a-zA-Z]+)_([a-zA-Z]+[0-9]+)(\.${suff})\$/\2_\1\3/")"
        echo "-- renaming $f -> $d/$r"
        mv "$f" "$d/$r"
    fi
done

相关内容