以下命令有效:
ssh host ls -1 /home/folder/anotherFolder | wc -l
但是这个不起作用:
ssh host num=`ls -1 /home/folder/anotherFolder | wc -l`
也不是:
ssh host num=`ls -1 "/home/folder/anotherFolder" | wc -l`
也不是:
ssh host num=`ls -1 "/home/folder/anotherFolder" | wc -l`
所有这些回归:
ls: cannot access /home/folder/anotherFolder: No such file or directory
因为它在客户端计算机中而不是在远程计算机中查找此文件夹。
编辑: 澄清: 我需要在ssh上下文中使用$ num,而不是在它之外。 整个ssh命令是检查$ num是否大于X,如果是,则在远程计算机上执行另一个命令,所有这些命令都在一个ssh会话中。
EDIT2: 谢谢,我已经在你的帮助下完成了我所需要的。 原始任务是删除远程计算机中最旧的文件夹(如果它具有多于X个已定义的文件夹)。 这对我有用:
ssh host "num=\$(ls -1 \$path | wc -l); if [ \$num -gt $num_of_backups ]; then rm -r $backup/\"\$(ls -t1 $backup | tail -n 1)\"; fi"
尽管如此,我怀疑它不是做我需要的最佳方式。 任何其他方式将非常感激。
答案 0 :(得分:5)
尝试以下方法:
ssh host "num=\$(ls -1 /home/folder/anotherFolder | wc -l); if [ \$num -gt 3 ]; then echo yes: \$num; fi"
您需要转义$
符号,否则它们将在本地主机上展开。
或者,使用单引号,然后您不必转义$
:
ssh host 'num=$(ls -1 /home/folder/anotherFolder | wc -l); if [ $num -gt 3 ]; then echo yes: $num; fi'
此外,最好使用$(command)
格式代替`command`
进行命令替换。
答案 1 :(得分:1)
任何未转义的管道和反引号都将在当前主机上进行评估。因此,
ssh host ls -1 /home/folder/anotherFolder | wc -l
表示在其他主机上运行ls -1 /home/folder/anotherFolder
并计算此主机上的行。“
这些命令都在当前主机上运行ls
和wc
,然后将num
分配给其他主持人:
ssh host num=`ls -1 /home/folder/anotherFolder | wc -l`
ssh host num=`ls -1 "/home/folder/anotherFolder" | wc -l`
ssh host num=`ls -1 "/home/folder/anotherFolder" | wc -l`
原型修复:
num=$(ssh host "ls -1 /home/folder/anotherFolder" | wc -l)
含义:在另一台主机上运行ls
,将所有数据发送到此主机,然后在其上运行wc
。将wc
的结果存储在num
中。 @ dogbane的解决方案更有效,因为它只返回计数,而不是所有ls
输出。
但是,a better way来计算文件数量是这样的:
num=$(ssh host "find /home/folder/anotherFolder -mindepth 1 -maxdepth 1 -printf x | wc -c")