使用 bash 重命名文件,命令说明
遵循这个问题使用find和sed递归重命名文件我自己找到了这个使用 find 重命名文件的解决方案,但我无法完全理解最后一部分
find . -name '*_test.rb' -exec bash -c 'echo mv $1 ${1/test.rb/spec.rb}' _ {} \;
任何人都可以解释字符 '_ {}', 的含义吗?我想这是从环境映射的某种参数,但是......
欢迎一些澄清。
Following this questionn Recursively rename files using find and sed I found by myself this solution to rename files using find, but I can not fully understand the last part
find . -name '*_test.rb' -exec bash -c 'echo mv $1 ${1/test.rb/spec.rb}' _ {} \;
Can anyone explain the meaning of characters '_ {}',? I guess that is some sort arguments mapping from enviroments, but ...
Some clarification will be welcome.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
字符串“{}”将替换为当前正在处理的文件名。
考虑以下情况:
但这里我们对找到的每个文件执行
sh -c ...
。另请注意,文件名以 $0(而不是 $1)形式传递到 shell。
如果我们想要优化代码,只要我们的命令一次接受多个参数进行处理,我们就可以使用如下内容:
注意 {} + 语法(相对于 {} \;)。从找到手册页:
但正如您所观察到的,第一个文件丢失了(因为 $@ 包含除 $0 之外的所有参数)。这就是为什么我们需要手动设置 $0,以便正确处理所有参数:
在某些情况下,您可能需要将 $0 设置为有意义的值。
The string `{}' is replaced by the current file name being processed.
Consider the following:
But here we execute
sh -c ...
for every single file found.Note also that the filename is passed to the shell as $0 (not $1).
If we wnat to optimize the code, as long as our command accepts more than one argument at a time for processing, we could use something like this:
Note the {} + syntax (vs. {} \;). From find man pages:
But as you observe, the first file is missing (because $@ contains all parameters except $0). That's why we need to set our $0 by hand, in order to process all arguments correctly:
In some situations you may need to set $0 to something meaningful.