Search code examples
bashshellloopsftplftp

Dynamic command execution with lftp - multiple commands


I'm sure there is a simple way to do this, but I am not finding it. What I want to do is execute a series of commands using lftp, and I want to avoid repeatedly connecting to the server if possible.

Basically, I have a file with a list full of ftp directories on the server. I want to connect to the server then execute something like the following: (assume at this point that I have already converted the text file into an array of lines using cat)

for f in "${myarray}"
do
cd $f;
nlist >> $f.txt;
cd ..;
done

Of course that doesn't work, but I have to imagine there is a simple solution to what I am trying to accomplish.

I am quite inexperienced when it comes to shell scripting. Any suggestions?


Solution

  • First build a string that contains the list of lftp commands. Then call lftp, passing the command on its standard input. Lftp itself can redirect the output of a command to a file, with a syntax that resembles the shell.

    list_commands=""
    for dir in "${myarray[@]}"; do
      list_commands="$list_commands
      cd \"$dir\"
      nlist >\"$dir.txt\"
      cd .."
    done
    
    lftp <<EOF
    open -u $username,$password $site
    $list_commands
    bye
    EOF
    

    Note that I assume that the directory names don't contain backslashes, single quotes or globbing characters. Add proper escaping if necessary.

    By the way, to read lines from a file, see Why is while IFS= read used so often, instead of IFS=; while read..?. You might prefer to combine reading from the list of directories and building the commands:

    list_commands=""
    while IFS= read -r dir; do
      list_commands="$list_commands
      cd \"$dir\"
      nlist >\"$dir.txt\"
      cd .."
    done <directory_list.txt