find -exec 在鱼中不起作用

find -exec 在鱼中不起作用

在使用 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给出结论性的演示:

qed

进一步阅读:

相关内容