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 上不可用。
在这里使用 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)