我有一个下面的shell脚本,我试图从中并行复制5个文件。我在machineA
上运行我的以下shell脚本,该脚本尝试从machineB
和machineC
复制文件。
如果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循环中移动以查找其他文件。我不确定为什么?
我在做什么事吗?
答案 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