Sh 脚本使用 ftp 放置文件列表

Sh 脚本使用 ftp 放置文件列表

所以我的脚本看起来像这样:

#...
files="$(find $line/processed/* 2>/dev/null)" #2>/dev/null used for error output suppression
if [[ ! -z "$files" ]]
then
                    #put_list="put"
                    #for word in $files; do
                    #       put_list="$put_list"$' '"$word"
                    #done

                    put_list="put $files" 
                    rm_list="rm $files"
yafc ftp://[email protected]  <<**
$put_list
close
quit
**
#...

因此,如果我像这样使用它,我会从 yafc 收到如下错误:

...
yafc 192.168.178.54:~/> No such command '/mnt/dir/processed/19,11,2014-14,17,25,,313', try 'help'
yafc 192.168.178.54:~/> No such command '/mnt/dir/processed/19,11,2014-14,17,41,,649"
...

每个文件都列在这里。只有第一个文件$files被放置在主机上。

但是如果我使用这个:(上面代码中注释掉的内容)

put_list="put"
for word in $files; do
     put_list="$put_list"$' '"$word"
done

一切都很完美!那么区别是什么呢?我试图用它tr来摆脱'\n'.如果我echo $put_list,在这两种情况下它们(似乎)是相同的。我不想迭代 $files 因为有时其中有很多数据,并且会花费很多时间。

那么,是否可以在没有这种昂贵的 for 循环的情况下完成这项工作呢?

答案1

files=$(echo $line/processed/*)
yafc ftp://[email protected]  <<**
put $files
close
quit
**

find命令用换行符分隔找到的文件(每行一个文件)。由于您实际上似乎不需要可以使用的查找功能files=$(echo $line/processed/*)

这里的文档扩展为

put file1
file2
file3
...

当您尝试循环时,您没有使用引号,因此换行符被解释为字段分隔符,因此每个文件都由您添加的空格分隔。

通过使用简单的files=$(echo $line/processed/*) $files现在,文件之间只有空格,因此put $files应该执行您想要的操作。

相关内容