使用Bash重命名文件,删除前缀和后缀

Ósc*_*pez 8 bash shell file-rename

我想用bash重命名一堆文件,转换这个文件模式:

prefix - name - suffix.txt
Run Code Online (Sandbox Code Playgroud)

进入这一个:

name.txt
Run Code Online (Sandbox Code Playgroud)

为此我写了以下脚本:

find . -name "*.txt" | while read f
do
  mv "${f}" "${f/prefix - /}"
done

find . -name "*.txt" | while read f
do
  mv "${f}" "${f/ - suffix/}"
done
Run Code Online (Sandbox Code Playgroud)

它有效,但我想使用单个循环执行重命名.可能吗?

che*_*ner 9

另一种方法,为了好玩,使用正则表达式:

regex='prefix - (.*) - suffix.txt'
for f in *.txt; do
    [[ $f =~ $regex ]] && mv "$f" "${BASH_REMATCH[1]}.txt"
done
Run Code Online (Sandbox Code Playgroud)

实际上,在这里使用简单模式'*.txt'有两个问题:

  1. 它太宽泛了; 您可能需要将正则表达式应用于许多不匹配的文件.
  2. 如果当前目录中有很多文件,命令行可能会溢出.

使用find复杂程序,但更正确:

find . -maxdepth 1 -regex 'prefix - .* - suffix.txt' -print0 | \
  while read -d '' -r; do
   [[ $REPLY =~ $regex ]] && mv "$REPLY" "${BASH_REMATCH[1]}.txt"
  done
Run Code Online (Sandbox Code Playgroud)