Объединить элементы массива с пробелом в Bash не работает - PullRequest
0 голосов
/ 30 января 2020

Я пытаюсь объединить содержимое списка файлов с удаленного сервера в один. Мой код пытался сначала получить список их путей в массив, что я успешно сделал:

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

Есть предложения? Может быть, есть гораздо более простой способ сделать это? Спасибо.

Ответы [ 2 ]

0 голосов
/ 31 января 2020

Если вы хотите объединить файлы, сделайте это. Вам не нужны пути к ним в отдельной переменной:

ssh myuser@myserver "find ${SLAP_PATH} -type f -name 'subm_*lfj_in.csv' -exec cat {} +" >final_file

Я также удалил -t из ssh, поскольку на самом деле нет причин выделять псевдо-tty. Я также удалил -q, потому что сообщения о диагностике c обычно выводятся по причине.

Если вы хотите, чтобы final_file на удаленном хосте, затем переместите перенаправление в команду, выполняемую удаленно.

0 голосов
/ 30 января 2020

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'"))
...