我想通过一堆目录,并重命名以_test.rb结尾的所有文件,而不是以_spec.rb结尾。 这是我从来没有觉得如何处理bash的东西,所以这次我想我会花一些时间来弄明白。 尽pipe我到目前为止已经尽力了,但我的最大努力是:
find spec -name "*_test.rb" -exec echo mv {} `echo {} | sed s/test/spec/` \;
注意:在exec之后还有一个额外的回声,这样当我testing它时,命令就会被打印出来而不是运行。
当我运行它时,每个匹配的文件名的输出是:
mv original original
即sed的replace已经丢失。 有什么窍门?
如果你没有rename (这是一个非常短的Perl脚本),或者你的重命名是更简单的util-linux版本,或者你只是想知道如何使你的命令工作:你只需要发送到shell执行:
find spec -name "*_test.rb" -exec sh -c 'echo mv "$1" "$(echo "$1" | sed s/test.rb\$/spec.rb/)"' _ {} \;
太复杂。 如果您有可用的rename命令,您可以尝试以下操作:
find . -name "*_test.rb" -print0 | xargs -0 rename "s/_test/_spec/"
这find相关的文件,将它们发送到xargs然后使用重命名工具(根据给定的perl正则expression式重命名文件)。