如何通过在文件名中移动模式来重命名一组文件

时间:2017-05-14 03:24:05

标签: sed rename file-rename

对于文件

test_001.log
test_002.log

我想将它们重命名为

001_test.log
002_test.log

我认为它应该像

for f in *.log; do mv "$f" "`echo $f | sed s/test_\(.*\)\.log/\1_test.log/`"; done

但我收到了错误

mv: `test_001.log' and `test_001.log' are the same file

我在这里做错了什么?

2 个答案:

答案 0 :(得分:1)

以下是工作片段:

for f in *.log; do mv $f `echo $f | sed 's/test_\(.*\)\.log/\1_test.log/'`; done;

我认为你错过引用's/test_\(.*\)\.log/\1_test.log/'并且可能没有返回你期望的内容。

答案 1 :(得分:1)

只需使用shell参数扩展并且无需外部工具即可实现:

$ for f in *.log; do fnew=${f#test_}; echo mv "$f" "${fnew%.log}"_test.log; done
mv test_001.log 001_test.log
mv test_002.log 002_test.log

删除echo以实际执行这些命令。

请注意,由于单词拆分和路径扩展,命令中不带引号的$f可能会使包含空格或shell元字符的文件名中断。