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 шт):
собственно вопрос звучит так: как с помощью программы 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 <-