Я беру список файлов с сервера через поиск через ssh
for f in `ssh -p ${SSH_PORT} -l ${SSH_USER} ${SSH_HOST} -t "find ${DIR_REMOTE} -type f | grep jpg" 2> /dev/null`
Когда я повторяю список в теле цикла for (echo ${f}
) все в порядке:
/a3/obieg/skan001/skan001.jpg
/a3/obieg/skan001/skan000.jpg
/a3/obieg/skan001/skan003.jpg
/a3/obieg/skan001/skan002.jpg
/a3/obieg/skan.jpg
Но когда я пытаюсь скопировать его через scp (в том же цикле) (scp -p -P ${SSH_PORT} ${SSH_USER}@${SSH_HOST}:"${f}" "${DIR_SUB}${2}_$(date +%Y%m%d_%H%M%S_%N.jpg)"
), результат:
: No such file or directory001.jpg
: No such file or directory000.jpg
: No such file or directory003.jpg
: No such file or directory002.jpg
: No such file or directory
Я не понимаю, что здесь происходит ...
весь сценарий:
SSH_USER=username
SSH_HOST=${1}
SSH_PORT=22
DIR_REMOTE="/a3/obieg/"
DIR_LOCAL="/b2/skany_temp_test/ot/"
DIR_SUB="${DIR_LOCAL}${2}/"
# foldery
mkdir "${DIR_LOCAL}" 2> /dev/null
mkdir "${DIR_SUB}" 2> /dev/null
# sync
for f in `ssh -p ${SSH_PORT} -l ${SSH_USER} ${SSH_HOST} -t "find ${DIR_REMOTE} -type f | grep jpg" 2> /dev/null`
do
# echo ${f}
scp -p -P ${SSH_PORT} ${SSH_USER}@${SSH_HOST}:"$f" "${DIR_SUB}${2}_$(date +%Y%m%d_%H%M%S_%N.jpg)"
# ssh -p ${SSH_PORT} -l ${SSH_USER} ${SSH_HOST} -t "rm ${f}"
done
Хорошо - я думаю, что нашел решение.
Я заменил scp
с участием rsync
и он показал мне полный путь (который в данном случае заканчивался ascii-последовательностью #\015
).
Это выглядит как scp
искал файл /some-path/some-file.jpg\r
, потому что цикл for разделил строки на \n
ssh -t
выделяет псевдотерминал, который возвращает оконечные окончания строк (\r\n
), как и screen
команда.
Я отправил каждый ответ ssh через dos2unix
, и теперь это работает.
find ${DIR_REMOTE} -type f -name "*.jpg" 2>/dev/null
find ${DIR_REMOTE} -type f -name "*.jpg" 2>/dev/null | sed 's/\r//g'
Вам не нужно делать
${SSH_USER}@${SSH_HOST}:"$(echo $f)"
в вашей команде SCP. Я ожидал, что это должно работать нормально:
${SSH_USER}@${SSH_HOST}:"${f}"
РЕДАКТИРОВАТЬ: перечитайте свой ответ ниже, если вы собирались echo
в команде копирования вам нужно будет сделать echo -n
чтобы отключить печать новой строки в конце.