bash测试SFTP服务器上是否存在文件

时间:2015-12-05 21:16:47

标签: bash

我遇到的问题是:" 不起作用" - 下面。最后一行确实有效 - 但我需要理解为什么倒数第二行没有。我需要检查远程服务器上是否存在文件。

需要检查以下位置的文件是否存在:

/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

4 个答案:

答案 0 :(得分:3)

Bash中的通配符和测试构造

您无法在 [命令中使用通配符来测试多个文件的存在。事实上,通配符将被扩展,所有文件将被传递给测试。结果是它会抱怨" -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

  

不对[[和]]之间的单词执行单词拆分和路径名扩展。