当我尝试使用这个命令时
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|^\.'"`
- 使用
"find [..]"
使用
tr
-s, --squeeze-repeats replace each input sequence of a repeated character that is listed in SET1 with a single occurrence of that character
使用
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