使用正则表达式复制/重命名多个文件(shell 脚本)

使用正则表达式复制/重命名多个文件(shell 脚本)

我有一个匹配模式的文件集合,例如“assignment02.cc”、“Assignment02.h”、“Assignment02.txt”等。我想将这些文件复制/重命名为“Assignment03.cc”、“Assignment03.txt”。 h'、'assignment03.txt' 等。

我怀疑使用 shell 脚本和 sed 应该可以直接完成。到目前为止我有:

OLD_NO=$1
NEW_NO=$2

echo "Moving from $OLD_NO to $NEW_NO"

for name in assignment$OLD_NO.* ; do
  newname=$(echo $name | sed 's/\(.*\)$OLD_NO\(.*\)/\1xx$NEW_NO\2/')
  echo "$name -> $newname"
  # mv -v $name $newname
done

不幸的是,我调用 sed 的方式总是返回输入字符串$name,并且实际上并不执行正则表达式查找/替换。

注意:在互联网上查找有一个rename具有此功能的命令,但在我的 MacBook 上不可用。

答案1

在这里使用 sed 带来的复杂性超过了它的价值。使用 shell 的内置文本操作功能。例如,从 中${name#assignment02}删除前缀。assignment02$name

for name in assignment02.*; do
  mv "$name" "assignment03${name#assignment02}"
done

如果您确定文件名不包含 shell 特殊字符,则不需要双引号。

如果您有可用的 zsh,它的zmv功能对于此类重命名很有帮助。

autoload zmv
zmv '(assignment)02.(*)' '${1}03.$2'

答案2

你已经想得太复杂了

rename 02 03 *02*

'rename' 将 arg3 或 (*02*) 之后给出的所有文件的名称中的第一个参数 ('02') 替换为第二个参数 ('03')

答案3

一种不同的方法:

for ext in {cc,h,txt}
do 
  echo mv assignment02.$ext assignment03.$ext
done

从长远来看:尝试“重命名”

答案4

您可以这样做的一种方法是:

ls -1  | sed "s/\(.*\)\..*$/mv '&' '\1.txt'/" | sh

相关内容