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

8 sed shell-script file-management rename

我有一组与“assignment02.cc”、“assignment02.h”、“assignment02.txt”等模式匹配的文件。我想将这些文件复制/重命名为“assignment03.cc”、“assignment03”。 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
Run Code Online (Sandbox Code Playgroud)

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

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

Gil*_*il' 5

在这里使用 sed 会引入更多的复杂性。使用 shell 的内置文本操作功能。例如,${name#assignment02}条带前缀assignment02$name

for name in assignment02.*; do
  mv "$name" "assignment03${name#assignment02}"
done
Run Code Online (Sandbox Code Playgroud)

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

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

autoload zmv
zmv '(assignment)02.(*)' '${1}03.$2'
Run Code Online (Sandbox Code Playgroud)


小智 -1

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

ls -1  | sed "s/\(.*\)\..*$/mv '&' '\1.txt'/" | sh
Run Code Online (Sandbox Code Playgroud)

  • [不解析 `ls` 的输出](http://mywiki.wooledge.org/ParsingLs)。生成 shell 脚本无疑是朝自己的头上开枪。Vault Boy 的问题包含 shell 端的合理方法,只是缺少正确的 sed 咒语和一些引用。 (2认同)