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


8

我有一组与“ 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

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

注意:在Internet上有一个rename具有此功能的命令,但该命令在我的MacBook上不可用。


将单引号更改为双引号。如果你周围有sed命令单引号,然后$OLD_NO$NEW_NO将不会扩大。
Mikel

newname=$(echo $name | tr $OLD_NO $NEW_NO)
尼扎姆·穆罕默德

Answers:


5

在这里使用sed会带来更多复杂性。使用外壳程序的内置文本操作功能。例如,从中${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'

3

您已经觉得太复杂了

rename 02 03 *02*

在arg3上或之后的所有文件名(* 02 *)中,“重命名”用第二个arg(“ 03”)替换第一个arg(“ 02”)


rename使用此语法的命令是Linux实用程序,在OSX上不可用(在大多数Debian和Ubuntu安装中甚至都不使用此名称)。
吉尔斯(Gilles)“所以

啊,不知道您正在使用osx,无赖
Patrick

重命名是一个Perl脚本,因此它可能会在OS X上运行。使用google在这里找到它:tips.webdesign10.com/files/rename.pl.txt
azzid

0

另一种方法:

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

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


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.