Question

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?

Was it helpful?

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
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top