查找并替换文件名中的字符串

she*_*har 1 linux unix batch command-line

我有数千个没有特定扩展名的文件。我需要做的是在文件名中搜索字符串并替换为其他字符串,然后进一步搜索第二个字符串并替换为任何其他字符串,依此类推。即:我有多个字符串可以替换为其他多个字符串。它可能是这样的:

  • 文件名中的“abc”替换为“def”*** 字符串“abc”可能存在于许多文件中
  • 文件名中的“jkl”替换为“srt”*** 字符串“jkl”可能存在于许多文件中
  • 文件名中的“pqr”替换为“xyz”*** 字符串“pqr”可能存在于许多文件中

我目前正在使用 Excel 宏获取 Excel 中的文件名,然后在一列中保留原始名称,并替换另一列中复制的内容中所需的名称。然后我为其创建一个批处理文件。喜欢:

rename Path\OriginalName1 NewName1
rename Path\OriginalName2 NewName2
Run Code Online (Sandbox Code Playgroud)

上述过程的问题在于,由于文件较多,因此需要花费大量时间。由于我使用的是 Excel 2003,行数也有限制。我需要一个批量脚本,例如:

replacestr  abc with def
replacestr  pqr with xyz
Run Code Online (Sandbox Code Playgroud)

在单个目录中。在unix脚本中做会更好吗?

小智 5

如果您可以使用 Bash,那么以下脚本应该可以执行您想要的操作:

#!/bin/bash

(( $# != 2 )) && exit 1

for f in *; do
  newf="${f//$1/$2}"
  if [[ $f != $newf ]]; then
    mv "$f" "$newf"
  fi
done
Run Code Online (Sandbox Code Playgroud)

它尝试用新字符串替换文件名,如果结果文件名与原始文件名不匹配,则它将文件重命名为结果文件名。

用法,如果保存为replacestr并给定要执行的模式:

$ ./replacestr abc def
Run Code Online (Sandbox Code Playgroud)

它将尝试重命名所有内容。您可以使用[[ ! -f $f ]]跳过非文件。~/.bashrc如果您经常需要,您也可以将其包装在函数中并从您那里获取它。