我有一个匹配模式的文件集合,例如“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