查找:缺少“-exec”参数

查找:缺少“-exec”参数

当我尝试使用这个命令时

var1=`sudo -u psoadmin -H -s ssh [email protected] find . -maxdepth 1 -type f -mtime +14 -exec ls -lh  \{} \; | awk '{print $5, $9}'|egrep -v '^./upload|^./download|^./archive|^\.'`

它把我抛为

find: missing argument to `-exec'

如果我在这方面犯了任何错误,请告诉我。

答案1

你有太多的 shell 在那里进行一些处理。另外,使用反引号是一个坏主意,尤其是当其中包含反斜杠时。您应该改用$(...)语法。

sudo -s启动 shell 来运行命令,但sudo尝试转义 shell 的一些特殊字符。你不想用那个。

ssh在远程主机上运行 shell 来解释由参数串联而成的命令行(参数之间有空格)。

所以在:

var1=`sudo -u psoadmin -H -s ssh [email protected] find . -maxdepth 1 -type f -mtime +14 -exec ls -lh  \{} \;`

sudo运行:

"/bin/bash", ["/bin/bash", "-c", 
  "ssh daill_scp\\@files.dc1.responsys.net find \\.  -maxdepth 1 -type f -mtime \\+14 -exec ls -lh \\{\\} \\;"]

/bin/bash或者用户的登录 shell 是什么)。

请注意如何sudo转义., +, },但没有转义反斜杠,没有特别好的理由。

然后 bash 将运行:

"/usr/bin/ssh", ["ssh", "[email protected]", "find", ".", "-maxdepth", "1", "-type", "f", "-mtime", "+14", "-exec", "ls", "-lh", "{}", ";"]

ssh将连接它们并在远程主机上运行:

"$SHELL", ["$SHELL", "-c", "find . -maxdepth 1 -type f -mtime + 14 -exec ls -lh {} ;"]

$SHELL这次远程用户的登录shell在哪里)。

上面的内容;没有转义,因此被解释为命令分隔符并且没有传递给find这就是为什么find抱怨-exec没有终止。

在这里,您想要:

var1=$(
  sudo -u psoadmin -H ssh [email protected] '
    find . -maxdepth 1 -type f -mtime +14 -exec ls -lh {} \;' |
    awk '{print $5, $9}' |
    egrep -v '^./upload|^./download|^./archive|^\.'
)

(并不是说该命令(尤其是该egrep部分)很有意义)。

答案2

试试这个方法:

...-exec ls -lh {} \;...

(删除大括号前的反斜杠)双引号:

var1=`sudo -u psoadmin -H -s ssh [email protected] "find . -maxdepth 1 -type f -mtime +14 -exec ls -lh  {} \; "| awk '{print $5, $9}'|egrep -v '^./upload|^./download|^./archive|^\.'`

答案3

当我尝试使用这个命令时

var1=`sudo -u psoadmin -H -s ssh [email protected] find . -maxdepth 1 -type f -mtime +14 -exec ls -lh  \{} \; | awk '{print $5, $9}'|egrep -v '^./upload|^./download|^./archive|^\.'`

这让我

find: missing argument to `-exec'

你应该使用这个:

var1=`sudo -u psoadmin -H -s ssh [email protected] "find . -maxdepth 1 -type f -mtime +14 -exec ls -lh  {} \;  | tr -s [:space:] | cut -d ' ' -f 5,9 | egrep -v '^./upload|^./download|^./archive|^\.'"`
  1. 使用"find [..]"
  2. 使用tr

    -s, --squeeze-repeats
          replace each input sequence of a repeated character that is listed in SET1 with a single occurrence of that character
    
  3. 使用cut

    -d, --delimiter=DELIM
          use DELIM instead of TAB for field delimiter
    -f, --fields=LIST
          select only these fields;  also print any line that contains no delimiter character, unless the -s option is specified
    

相关内容