だから私のスクリプトは次のようになります
#...
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'
。 If Iecho $put_list
どちらの場合も同じようです。時々$filesに多くのデータがあり、多くの時間がかかるので、繰り返したくありません。
それでは、高価なforループなしでこれを実行できますか?
答え1
files=$(echo $line/processed/*)
yafc ftp://[email protected] <<**
put $files
close
quit
**
このfind
コマンドは、見つかったファイルを改行(1行に1つのファイル)に分割します。実際に検索機能が不要なようですので使用できますfiles=$(echo $line/processed/*)
。
ここでのドキュメントは次に展開されます。
put file1
file2
file3
...
ループを試みるときに引用符を使用しなかったため、改行はフィールド区切り文字として解釈され、各ファイルによって追加されたスペースで区切られました。
simple nowを使用すると、files=$(echo $line/processed/*)
$files
ファイル間にスペースがあるため、put $files
必要に応じて機能します。