Исключить файл при загрузке каталогов

Я написал простой сценарий оболочки, который использует 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 ответа

Решение

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

#! / usr / bin / env bash

для меня в / localDir / *; делать
    [[ "$i" = */upload.sh ]] && продолжить
    ncftpput -R -v -u myUsername -p myPassword myAddress /remoteDir "$i"
сделанный

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

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

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


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

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

Другие вопросы по тегам