我遇到的问题是:" 不起作用" - 下面。最后一行确实有效 - 但我需要理解为什么倒数第二行没有。我需要检查远程服务器上是否存在文件。
需要检查以下位置的文件是否存在:
/home/remoteuser/files/
当处理文件时,它们将被移动到:
/home/remoteuser/logs/archive/
如果文件存在,则想要创建警报 - 换句话说,文件未被处理:
/home/remoteuser/logs/
找到以下页面,似乎正是我要找的: http://www.cyberciti.biz/tips/find-out-if-file-exists-with-conditional-expressions.html
测试这个,我知道那里有文件,但不起作用:
ssh remoteuser@1.2.3.4 [ ! -f /home/remoteuser/logs/archive/*.* ] && echo "File does not exist in the root" >> /home/localuser/files/dirlist.txt
因为我们知道这有效并且确实列出了本地服务器上的文件:
ssh remoteuser@1.2.3.4 ls -l /home/remoteuser/logs/archive/*.* >> /home/localuser/files/dirlist.txt
答案 0 :(得分:3)
您无法在 [命令中使用通配符来测试多个文件的存在。事实上,通配符将被扩展,所有文件将被传递给测试。结果是它会抱怨" -f"给出了太多的论据。
在任何非空目录中尝试此操作以查看输出:
[ ! -f *.* ]
上述命令不会失败的唯一情况是,只有一个文件与表达式匹配,在您的情况下是一个非隐藏文件格式为" *。*"在/ home / remoteuser / logs / archive /
中使用查找
一种可能的解决方案是将find与grep结合使用:
ssh name@server find /path/to/the/files -type f -name "\*.\*" 2>/dev/null | grep -q . && echo "Not Empty" || echo "Empty"
找到搜索常规文件(-type f),其名称的格式为。( - name),如果没有找到则返回false,然后" grep -q。&# 34;如果发现某事,则返回1或0。
答案 1 :(得分:2)
您的目标只能使用shell内置函数完成 - 并且在传递无效语法时(如[ ! -e *.* ]
方法所做的那样)不依赖于它们的行为。这消除了在远程系统上具有可访问的,有效find
命令的依赖性。
考虑:
rmtfunc() {
set -- /home/remoteuser/logs/*.* # put contents of directory into $@ array
for arg; do # ...for each item in that array...
[ -f "$arg" ] && exit 0 # ...if it's a file that exists, success
done
exit 1 # if nothing matched above, failure
}
# emit text that defines that function into the ssh command, then run same
if ssh remoteuser@host "$(declare -f rmtfunc); rmtfunc"; then
echo "Found remote logfiles"
else
echo "No remote logfiles exist"
fi
答案 2 :(得分:0)
<强>解答:强> 找到了关于使用-e作为常规文件的以下内容。
http://www.cyberciti.biz/faq/unix-linux-test-existence-of-file-in-bash/
即使它说“论证太多”,它似乎也可以测试出来。
ssh remoteuser@1.2.3.4 [ ! -e /home/remoteuser/logs/archive/*.zip ] && echo "File does not exists in the root" >> /home/localuser/files/dirlist.txt || echo "File does exists in the root" >> /home/localuser/files/dirlist.txt
答案 3 :(得分:0)
您的脚本只使用双括号:
ssh remoteuser@1.2.3.4 [[ ! -f /home/remoteuser/logs/archive/*.* ]] && echo "File does not exist in the root" >> /home/localuser/files/dirlist.txt
来自man bash
不对[[和]]之间的单词执行单词拆分和路径名扩展。