我正在尝试将来自远程服务器的文件列表的内容合并为一个。我的代码试图首先将它们的路径列表放入数组中,而我成功做到了:
day_of_week=`date +%w`
if [[ $day_of_week == 1 ]]; then
look_back=3
else
look_back=1
fi
DATE=$(date -d "$look_back day ago" '+%Y%m%d')
SLAP_PATH="/ns/local/data/internal/SUBM/data/SLAP_376_SUBM1/data/${DATE}/processed/"
FILES=$(ssh -tq myuser@myserver "find ${SLAP_PATH} -type f -name 'subm_*lfj_in.csv'")
FILES变量:
/ns/local/data/internal/SUBM/data/SLAP_376_SUBM1/data/20200129/processed/subm_144_lfj_in.csv
/ns/local/data/internal/SUBM/data/SLAP_376_SUBM1/data/20200129/processed/subm_140_lfj_in.csv
/ns/local/data/internal/SUBM/data/SLAP_376_SUBM1/data/20200129/processed/subm_145_lfj_in.csv
(...)
因此,现在我尝试将每个值连接到一个名为“ CMD”的字符串变量中,因此可以尝试使用类似以下内容的东西:
cat file1 file2 file3... > final_file
问题是我无法创建文件名序列。这是我的代码:
CMD=""
for ((i = 0; i < ${#FILES[@]}; i++)); do
#remove \n
tmp=`echo ${FILES[$i]} | tr -d '\n'`
#concatenate into $CMD:
CMD="$CMD $tmp"
done
echo "This is CMD: $CMD"
每次运行脚本时,都会得到以下信息:
$$ ./exportReconData.sh
/ns/local/data/internal/SUBM/data/SLAP_376_SUBM1/data/20200129/processed/subm_147_lfj_in.csv44_lfj_in.csv
有什么建议吗?也许有更简单的方法可以做到这一点?谢谢。
答案 0 :(得分:0)
FILES
不是数组。要创建数组,您需要将()
放在赋值中:
IFS=$'\n\r' # so spaces won't delimit array elements
FILES=($(ssh -tq myuser@myserver "find ${SLAP_PATH} -type f -name 'subm_*lfj_in.csv'"))
答案 1 :(得分:0)
如果要串联文件,请这样做。您不需要在单独的变量中指向它们的路径:
ssh myuser@myserver "find ${SLAP_PATH} -type f -name 'subm_*lfj_in.csv' -exec cat {} +" >final_file
我也从-t
中删除了ssh
,因为实际上没有理由分配伪tty。我还删除了-q
,因为诊断消息通常是出于某种原因而输出。
如果要在远程主机上使用final_file
,则将重定向移到远程执行的命令中。