xargs + lftp(mget)

Есть код, который должен скачать недостающие файлы с ftp, недостающие файлы записываются в переменную $DIFF.

#!/bin/bash


# Заходим на сервер и смотрим корень
# Ищем все файлы с расширением .jpg

IP=$1
USER=$2
PASS=$3
OUTPATH=$4


# ищем все файлы с расширением .jpg и .sign
FILES_IN_FTP=$(lftp -c "open -u $USER,PASS $IP; find /"| grep "/*.jpg")
CHECK_FILE=$(cat IP.list)


for FILE_IN_FTP in $FILES_IN_FTP;do
    if [[ $CHECK_FILE == *"$FILE_IN_FTP"* ]]
    then
        echo "Найдено"
    else
        DIFF="$DIFF $FILE_IN_FTP"
    fi;done

echo $FILES_IN_FTP > $COMPLEX_IP.list

if [[ $DIFF != "" ]]
then
    echo $DIFF |  xargs -n4 -d " " lftp -c "open -u '$USER','$PASS' '$IP'; mget -d -O '$OUTPATH'/'$IP'/"
fi

файлы нужно скачать по 4 штуки в одном ftp запросе


Ответы (1 шт):

Автор решения: aleksandr barakin

собственно вопрос звучит так: как с помощью программы xargs передавать вызываемой программе по n элементов за раз, подставив их все в нужное место команды?

вот так работает отлично (в примерах n=2 для компактности):

$ seq 123 127 | xargs -n2 echo
123 124
125 126
127

а если попытаться подставить в нужное место команды, воспользовавшись опцией -I программы xargs, то элементы подставляются по одному:

$ seq 123 127 | xargs -n2 -I {} echo '-> {} <-'
-> 123 <-
-> 124 <-
-> 125 <-
-> 126 <-
-> 127 <-

выйти из положения можно использованием промежуточного вызова программы оболочки (например, sh). тогда элементы будут переданы оболочке как дополнительные «номерные» аргументы ($0, $1, $2 и т.д.):

$ seq 123 127 | xargs -n2 sh -c 'echo "-> $0 $1 <-"'
-> 123 124 <-
-> 125 126 <-
-> 127  <-
→ Ссылка