在使用 Fish 作为我的 shell 时,我尝试使用以下命令对当前目录中的一堆 C 源文件设置权限
find . -type f -name "*.c" -exec chmod 644 {} +;
我收到一个错误
查找:缺少“-exec”参数
或者
find . -type f -name "*.c" -exec chmod 644 {} \;
我收到一个错误
chmod: 无法访问 '': 没有这样的文件或目录
怎么了?
答案1
fish
恰好是{}
少数需要引用的shell 之一。
因此,使用该 shell,您需要:
find . -type f -name '*.c' -exec chmod 644 '{}' +
如果不加引号,{}
则扩展为空参数,因此该命令与以下内容相同:
find . -type f -name '*.c' -exec chmod 644 '' +
并find
抱怨缺失{}
(或;
as仅在跟随时+
被识别为终结者)。-exec
{}
对于大多数其他 shell,您不需要{}
.
答案2
{
对}
鱼有特殊的意义。它们需要转义才能使用find
,例如:
find . -type f -name "*.c" -exec chmod 644 \{\} \;
或者你必须引用{}
这样的内容,
find . -type f -name "*.c" -exec chmod 644 '{}' \;
答案3
您的示例缺少预期的尾随分号:
find . -type f -name "*.c" -exec chmod 644 {} \;
修改完题后,是“鱼”壳。这是一个已知问题,可以使用 @rahul 注意到的引用来解决。但是,建议的转义不适用于我的配置:单引号可以:
find . -type f -name "*.c" -exec chmod 644 '{}' \;
find . -type f -name "*.c" -exec chmod 644 '{}' +
什么做发生的情况(如果键入字符而不是剪切/粘贴)是在尝试编辑命令行以转义大括号时,鱼感到困惑并且无法继续。这是插入反斜杠后的屏幕截图(尝试剪切/粘贴没有意义那):
然后按回车键:
所以不,fish 并不能真正与转义的花括号一起使用。它只是假装这样做。继续按enter给出结论性的演示:
进一步阅读: