如何从bash shell脚本远程登录文件列表?

时间:2014-05-06 22:02:33

标签: linux bash unix ssh

我有一个下面的shell脚本,我试图从中并行复制5个文件。我在machineA上运行我的以下shell脚本,该脚本尝试从machineBmachineC复制文件。

如果machineB中的文件不存在,那么它应该位于machineC中。

我在这里使用GNU Parallel来并行下载五个文件。如果所有文件都在那里,一切正常 -

#!/bin/bash

export PRIMARY=/data01/primary
export FILERS_LOCATION_1=machineB
export FILERS_LOCATION_2=machineC
export MEMORY_MAPPED_LOCATION=/bexbat/data/be_t1_snapshot
PRIMARY_PARTITION=(550 274 2 546 278 6 558 282 10 554 286 14) # this will have more file numbers

export dir1=/bexbat/data/re_t1_snapshot/20140501

# just iterating the file and doing ls and exit if any of the file is missing
for el in "${PRIMARY_PARTITION[@]}"
do
    ssh david@$FILERS_LOCATION_1 ls $dir3/t1_weekly_1680_"$el"_200003_5.data || ssh david@$FILERS_LOCATION_2 ls $dir3/t1_weekly_1680_"$el"_200003_5.data || echo "File number $el missing on both the filers for primary partition." >&2; exit 1
done

echo "All files present. Starting to copy now."

# copy the files now

问题陈述: -

在复制任何文件之前,我想查看是否所有文件都已存在于任何一台机器(machineB或machineC)中。如果缺少任何文件,那么我需要打印出哪个文件丢失并退出shell脚本并且状态为非零。

上面的脚本不像我描述的那样工作。如果它看到任何文件存在,那么它会自动退出,它不会在for循环中移动以查找其他文件。我不确定为什么?

我在做什么事吗?

2 个答案:

答案 0 :(得分:1)

循环中的ssh行没有达到预期效果。分号的优先级低于其他运算符,因此当您使用; exit 1后缀时,将始终执行。您可以使用if语句:

if ! ssh david@$FILERS_LOCATION_1 ls $dir3/t1_weekly_1680_"$el"_200003_5.data && \
   ! ssh david@$FILERS_LOCATION_2 ls $dir3/t1_weekly_1680_"$el"_200003_5.data;
then
    echo "File number $el missing on both the filers for primary partition." >&2
    exit 1
fi

答案 1 :(得分:1)

ssh不会保留引用,因此您需要在本地转义命令才能被远程shell取消转义。

for el in "${PRIMARY_PARTITION[@]}"
do
    printf -v cmd '%q ' test -e "$dir3/t1_weekly_1680_${el}_200003_5.data"
    ssh "david@$FILERS_LOCATION_1" "$cmd" \
    || ssh "david@$FILERS_LOCATION_2" "$cmd" \
    || { echo "File number $el missing on both the filers for primary partition." >&2;
         exit 1; }
done