如果本地文件不存在,则从远程计算机scp它并打印消息

时间:2014-01-22 21:41:49

标签: bash shell

我想在bash脚本中执行的操作是,如果我的本地计算机中不存在给定文件,则从远程计算机scp它并相应地打印消息。我看过很多相关的帖子都找不到解决方案。

这很方便,我试过但它似乎不适用于&&。

  cmd=(echo "hello world")

这是我的命令:

  RESULTS_FILE="$TESTCASE_DIR"/"$FILENAME"_"$i".csv
  SCP_CMD="scp -2 ${HOST}:${REMOTE_TESTCASE_DIR}/${FILENAME}.csv ${RESULTS_FILE} 2>&1"

  if [ ! -f ${RESULTS_FILE} ] && [ eval $SCP_CMD ] ; then
      echo "Successfully scped the file";
  else 
      echo "SCP failed"
  fi

此操作失败,错误为[: eval: unary operator expected。 反引号也不起作用。

2 个答案:

答案 0 :(得分:1)

[ ]用于测试条件。在您的情况下,您不需要在eval方面测试条件,您只需要在eval的左半部分的真实返回时执行&&(文件没有不存在。。

因此,这就像从[]表达式中删除eval一样简单。

  RESULTS_FILE="$TESTCASE_DIR"/"$FILENAME"_"$i".csv
  SCP_CMD="scp -2 ${HOST}:${REMOTE_TESTCASE_DIR}/${FILENAME}.csv ${RESULTS_FILE} 2>&1"

  if [ ! -f ${RESULTS_FILE} ] && eval $SCP_CMD; then
      echo "Successfully scped the file";
  else 
      echo "SCP failed"
  fi

你应该能够在没有eval的情况下做到这一点。只需直接插入命令即可在相同条件下执行(非现有文件)。

  RESULTS_FILE="$TESTCASE_DIR"/"$FILENAME"_"$i".csv

  if [ ! -f ${RESULTS_FILE} ] && scp -2 "${HOST}:${REMOTE_TESTCASE_DIR}/${FILENAME}.csv" ${RESULTS_FILE} 2>&1; then
      echo "Successfully scped the file";
  else 
      echo "SCP failed"
  fi

答案 1 :(得分:1)

您可以使用rsync实用程序

将本地计算机上的文件与远程同步
rsync -avz ${HOST}:${REMOTE_TESTCASE_DIR} ${TESTCASE_DIR}
  • a - 存档,一种快速的方式,表示你想要递归,并希望保留几乎所有内容;
  • v - verbose
  • z - 转移期间压缩数据

rsync执行的示例

$ rsync -avz Directory1/ Directory2/
sending incremental file list
./
file1.txt
file2.txt

sent 264 bytes  received 53 bytes  634.00 bytes/sec
total size is 94  speedup is 0.30