3 回答
TA贡献1852条经验 获得超7个赞
发生这种情况是因为sed接收到该字符串{}作为输入,可以使用以下命令进行验证:
find . -exec echo `echo "{}" | sed 's/./foo/g'` \;
foofoo递归地为目录中的每个文件打印。出现这种情况的原因是,当管道扩展整个命令时,管道将由外壳执行一次。
由于无法通过外壳执行命令并且没有管道或反引号的概念,因此无法以对每个文件都执行sed管道的方式来引用管道。GNU findutils手册介绍了如何通过将管道放置在单独的shell脚本中来执行类似的任务:findfind
#!/bin/sh
echo "$1" | sed 's/_test.rb$/_spec.rb/'
(sh -c在一个命令中可能有一些错误的使用方式和大量的引号来完成所有这些操作,但是我不会尝试。)
TA贡献1856条经验 获得超17个赞
要以最接近原始问题的方式解决它,可能要使用xargs“每个命令行的args”选项:
find . -name *_test.rb | sed -e "p;s/test/spec/" | xargs -n2 mv
它递归地在当前工作目录中查找文件,回显原始文件名(p),然后回显修改的名称(s/test/spec/),并将它们全部mv成对地馈入(xargs -n2)。注意在这种情况下路径本身不应包含字符串test。
TA贡献1864条经验 获得超6个赞
您提到您正在bash用作外壳,在这种情况下,您实际上并不需要使用find它sed来实现要重命名的批处理...
假设您将其bash用作外壳程序:
$ echo $SHELL
/bin/bash
$ _
...并假设您启用了所谓的globstarshell选项:
$ shopt -p globstar
shopt -s globstar
$ _
...最后假设您已经安装了该rename实用程序(可在util-linux-ng软件包中找到)
$ which rename
/usr/bin/rename
$ _
...然后您可以按以下步骤在bash一线式中实现批量重命名:
$ rename _test _spec **/*_test.rb
(globstarshell选项将确保bash能够找到所有匹配的*_test.rb文件,无论它们在目录层次结构中的嵌套深度如何...用于help shopt了解如何设置该选项)
- 3 回答
- 0 关注
- 1212 浏览
添加回答
举报