我正在CI / CD管道内使用SSH(因此它是非交互式的),并尝试执行一对find
命令(以及其他命令)以在执行LFTP后更改文件和目录的所有权< em> mirror ,但我不断收到此错误(这会使整个管道失败):
find: missing argument to `-exec'
这是使用find
的命令:
ssh -i ~/.ssh/id_rsa $USERNAME@$HOST "[other commands...]; find $SOME_PATH/ -type d -exec 'chmod 755 {} \;' && find $SOME_PATH/ -type f -exec 'chmod 644 {} \;' && echo Done"
我已经尝试过使用转义的双引号,例如:-exec \"chmod 755 {} \;\"
-但总是抛出相同的错误。
这里的主要问题是什么?
编辑:已解决。。我删除了-exec
的所有引号,删除了&&
,并在每个;
后面加了一个分号find
。并按预期工作。
ssh -i ~/.ssh/id_rsa $USERNAME@$HOST "[other commands...]; find $SOME_PATH/ -type d -exec chmod 755 {} \;; find $SOME_PATH/ -type f -exec chmod 644 {} \;; echo Done"
因此请使用-exec whatever-command {} \;; [other command, echo, find, ls, whatever...]
。
请查看此答案以获取更多信息:https://unix.stackexchange.com/a/139800/291364
[...]当
find
在exit
指令后看到虚假的-exec … ;
时,它不知道该怎么做;可能会(错误)猜测您将其作为遍历的路径。您需要一个命令分隔符:在;
之后放置另一个\;
(前面有空格也没有空格)。 [...]
答案 0 :(得分:1)
\;
处理为;
local 。您需要转义反斜杠,以便;
在远端保持转义。
ssh -i ~/.ssh/id_rsa $USERNAME@$HOST \
"[other commands...]; find $SOME_PATH/ -type d -exec 'chmod 755 {} \\;'
&& find $SOME_PATH/ -type f -exec 'chmod 644 {} \\;' && echo Done"
一个更好的主意是对命令参数使用单引号,并将$SOME_PATH
的值作为参数传递给shell。
ssh -i ~/.ssh/id_rsa $USERNAME@$HOST \
sh -c '...;
find "$1" -type d -exec chmod 755 {} \; &&
find "$1" -type f -exec chmod 644 {} \; &&
echo Done' _ "$SOME_PATH"
请注意,chmod
及其参数必须分别是find
的独立参数。
实际上,您不需要运行find
两次;您可以提供两个-exec
原色,每个原色与不同的-type
配对:
ssh -i ~/.ssh/id_rsa $USERNAME@$HOST \
sh -c '...;
find "$1" \( -type d -exec chmod 755 {} \; \) -o
\( -type f -exec chmod 644 {} \; \)
&& echo Done' _ "$SOME_PATH"
答案 1 :(得分:0)
除了使用复杂的find
命令(以及相关的引号/转义混乱)外,您可以使用chmod
符号模式的内置功能来不同地设置文件和导演的权限。具体来说,“ X
”权限本质上是指“在有意义的情况下执行”,这主要是指目录而不是文件。主要的例外是,如果有一个已经设置了执行文件的文件,它将假定它是有意保留的。如果可以的话,您可以使用以下更简单的命令:
chmod -R u=rwX,go=rX "$1" # Set non-executable files to 644, executables and directories to 755
如果您需要专门清除文件上的执行位,或者只是想坚持使用find
,则另一个选择是利用chmod
接受多个参数来使用find ... -exec ... {} +
的事实\;
版本。 “ +
”不是壳元字符,因此不需要特殊处理:
find $SOME_PATH/ -type d -exec chmod 755 {} + ; find $SOME_PATH/ -type f -exec chmod 644 {} +