Я написал простой скрипт оболочки, который использует ncftpput для рекурсивной загрузки всех каталогов из локального каталога в удаленный каталог. Мой сценарий оболочки upload.sh находится в этом локальном каталоге, и я хотел бы исключить его из загрузки. Есть какой-либо способ сделать это?

ncftpput -R -v -u myUsername -p myPassword myAddress /remoteDir /localDir/*

Я пытался сделать это так:

for i in `ls /localDir | grep -v upload.sh`; do
  ncftpput -R -v -u myUsername -p myPassword myAddress /remoteDir /localDir/$i
done

Но каталоги с пробелами будут считаться двумя каталогами. Например, "Мой каталог" будет считаться:

  1. / LocalDir / My
  2. / LocalDir / Каталог

2 ответа2

5

Вы можете использовать find, чтобы загрузить все остальные элементы отдельно:

find /localDir -mindepth 1 -maxdepth 1 ! -name "upload.sh" -exec ncftpput -R -v -u myUsername -p myPassword myAddress /remoteDir {} \;

Пропустите -exec и все после него, чтобы просто напечатать соответствующие файлы и папки, для тестирования.


Вы также можете изучить переопределение IFS в bash или эквивалент в вашей оболочке, но это все равно не удастся с именами файлов, содержащими, например, символы новой строки.

Конечно, самым простым решением было бы не смешивать скрипт загрузки с данными, которые нужно загрузить ...

2

Вот почему вы никогда не должны анализировать вывод ls. Особенно, если вы можете сделать то же самое с простым подстановочным знаком.

#!/usr/bin/env bash

for i in /localDir/*; do
    [[ "$i" = */upload.sh ]] && continue
    ncftpput -R -v -u myUsername -p myPassword myAddress /remoteDir "$i"
done

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .